BatteryStatsImpl.java revision f37447bad3773b62176baa837908daf6edb44273
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
193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasaniimport android.bluetooth.BluetoothHeadset;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.NetStat;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
25c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
27f37447bad3773b62176baa837908daf6edb44273Amith Yamasaniimport android.telephony.ServiceState;
28e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
29627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
44c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
60f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private static final int VERSION = 41;
61e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
62e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    private static int sNumSpeedSteps;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mFile;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mBackupFile;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
77c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>();
78c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>();
79c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>();
80c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers
81c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            = new SparseArray<ArrayList<StopwatchTimer>>();
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mScreenOnTimer;
1033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mScreenBrightnessBin = -1;
105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
106617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
107617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    Counter mInputEventCounter;
108617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
110c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mPhoneOnTimer;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
112244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mAudioOn;
113244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mAudioOnTimer;
114244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
115244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mVideoOn;
116244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mVideoOnTimer;
117244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
118627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
119c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneSignalStrengthsTimer =
120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS];
121f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
122f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    StopwatchTimer mPhoneSignalScanningTimer;
123f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
124627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneDataConnectionsTimer =
126c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
127627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
128105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
129c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiOnTimer;
130617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mWifiOnUid = -1;
131d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
132d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    boolean mWifiRunning;
133c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiRunningTimer;
134105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
135105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
136c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mBluetoothOnTimer;
1373f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1383f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /** Bluetooth headset object */
1393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    BluetoothHeadset mBtHeadset;
1403f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
1513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
1543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
155105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
156105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
157105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
158633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeStartLevel;
159633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeCurrentLevel;
160244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
162244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    // Mobile data transferred while on battery
1643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataTx = new long[4];
1653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataRx = new long[4];
1663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataTx = new long[4];
1673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataRx = new long[4];
1683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
1693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataUptime;
1703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataStart;
1713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
1723f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingCount;
1733f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingStart = -1;
1743f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
175f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    private int mPhoneServiceState = -1;
176f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
177c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
178c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
179c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
180c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final HashMap<String, SamplingTimer> mKernelWakelockStats =
181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, SamplingTimer>();
182c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
183c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public Map<String, ? extends SamplingTimer> getKernelWakelockStats() {
184c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mKernelWakelockStats;
185c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
186c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
187c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static int sKernelWakelockUpdateVersion = 0;
188c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
189c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int[] PROC_WAKELOCKS_FORMAT = new int[] {
190c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
191c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 1: count
192c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
193c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
195c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 5: totalTime
196c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    };
197c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
198c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final String[] mProcWakelocksName = new String[3];
199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final long[] mProcWakelocksData = new long[3];
200c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
201c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
202c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added
203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * to mKernelWakelockStats.
204c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
205c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> mProcWakelockFileStats =
206c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, KernelWakelockStats>();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>();
20932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
222617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
223e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class Counter extends BatteryStats.Counter implements Unpluggable {
224617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mCount;
225617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLoadedCount;
226617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLastCount;
227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mUnpluggedCount;
228617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mPluggedCount;
229617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
230617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables, Parcel in) {
231617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mPluggedCount = mCount = in.readInt();
232617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLoadedCount = in.readInt();
233617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLastCount = in.readInt();
234617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = in.readInt();
235617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
236617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
237617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables) {
239617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
240617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
241617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
242617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void writeToParcel(Parcel out) {
243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mCount);
244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLoadedCount);
245617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLastCount);
246617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mUnpluggedCount);
247617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
248617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
249617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void unplug(long batteryUptime, long batteryRealtime) {
250617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = mCount = mPluggedCount;
251617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
253617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void plug(long batteryUptime, long batteryRealtime) {
254617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mPluggedCount = mCount;
255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Writes a possibly null Counter to a Parcel.
259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param out the Parcel to be written to.
261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param counter a Counter, or null.
262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static void writeCounterToParcel(Parcel out, Counter counter) {
264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (counter == null) {
265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0); // indicates null
266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return;
267617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
268617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(1); // indicates non-null
269617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            counter.writeToParcel(out);
271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
272617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
274c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            int val;
276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (which == STATS_LAST) {
277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mLastCount;
278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mCount;
280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (which == STATS_UNPLUGGED) {
281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mUnpluggedCount;
282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                } else if (which != STATS_TOTAL) {
283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mLoadedCount;
284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return val;
288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void logState(Printer pw, String prefix) {
291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            pw.println(prefix + "mCount=" + mCount
292617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mUnpluggedCount=" + mUnpluggedCount
294617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mPluggedCount=" + mPluggedCount);
295617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
296617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
297617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void stepLocked() {
298617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mCount++;
299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void writeSummaryFromParcelLocked(Parcel out) {
302617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mCount);
303617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mCount - mLoadedCount);
304617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
306617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void readSummaryFromParcelLocked(Parcel in) {
307617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mCount = mLoadedCount = in.readInt();
308617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLastCount = in.readInt();
309617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = mPluggedCount = mCount;
310617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
311617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
312e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
313e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public static class SamplingCounter extends Counter {
314e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
315e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables, Parcel in) {
316e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables, in);
317e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
318e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
319e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        SamplingCounter(ArrayList<Unpluggable> unpluggables) {
320e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            super(unpluggables);
321e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
322e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
323e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        public void addCountLocked(long count) {
324e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            mCount += count;
325e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        }
326e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
327e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
328617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
331c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static abstract class Timer extends BatteryStats.Timer implements Unpluggable {
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
333c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        /**
370244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * Constructs from a parcel.
371244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param type
372244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param unpluggables
373244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param powerType
374244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param in
375244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         */
376c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
378c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastCount = in.readInt();
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTime = in.readLong();
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
390c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables) {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
394c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
395c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract long computeRunTimeLocked(long curBatteryRealtime);
396c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
397c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract int computeCurrentCountLocked();
398c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLastCount);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLastTime);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
427c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
428c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
429c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " old mTotalTime=" + mTotalTime);
430c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
431c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = computeRunTimeLocked(batteryRealtime);
432c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = computeCurrentCountLocked();
433c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
434c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType
435c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + ": new mTotalTime=" + mTotalTime);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long getTotalTimeLocked(long batteryRealtime, int which) {
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
474c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
479c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                val = computeCurrentCountLocked();
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
490627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + " mCount=" + mCount
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
494627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
496627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
498c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
499c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
500c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
501c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
502c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long runTime = computeRunTimeLocked(batteryRealtime);
503c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Divide by 1000 for backwards compatibility
504c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong((runTime + 500) / 1000);
505c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(((runTime - mLoadedTime) + 500) / 1000);
506c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount);
507c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount - mLoadedCount);
508c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
509c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
510c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
511c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Multiply by 1000 for backwards compatibility
512c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = mLoadedTime = in.readLong() * 1000;
513c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mLastTime = in.readLong() * 1000;
514c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedTime = mTotalTime;
515c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = mLoadedCount = in.readInt();
516c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mLastCount = in.readInt();
517c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedCount = mCount;
518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
520c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class SamplingTimer extends Timer {
522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported count from /proc/wakelocks.
525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mCurrentReportedCount;
527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
529c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported count from /proc/wakelocks when unplug() was last
530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
531c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
532c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUnpluggedReportedCount;
533c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
534c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
535c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported total_time from /proc/wakelocks.
536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mCurrentReportedTotalTime;
538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported total_time from /proc/wakelocks when unplug() was last
542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUnpluggedReportedTotalTime;
545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently in a discharge cycle.
548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mInDischarge;
550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
551c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently recording reported values.
553c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mTrackingReportedValues;
555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
556c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /*
557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * A sequnce counter, incremented once for each update of the stats.
558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUpdateVersion;
560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) {
562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables, in);
563c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = in.readInt();
564c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = in.readInt();
565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = in.readLong();
566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = in.readLong();
567c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
568c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
569c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge,
572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                boolean trackReportedValues) {
573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables);
574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = trackReportedValues;
575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
578c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setStale() {
579c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = false;
580c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = 0;
581c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = 0;
582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
584c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setUpdateVersion(int version) {
585c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateVersion = version;
586c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getUpdateVersion() {
589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUpdateVersion;
590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedCount(int count) {
593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedCount == 0) {
594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
595c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = count;
596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
597c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
598c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = count;
600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedTotalTime(long totalTime) {
603c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedTotalTime == 0) {
604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = totalTime;
606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = totalTime;
610c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void unplug(long batteryUptime, long batteryRealtime) {
613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.unplug(batteryUptime, batteryRealtime);
614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mTrackingReportedValues) {
615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = mCurrentReportedCount;
617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = true;
619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
620c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.plug(batteryUptime, batteryRealtime);
623c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = false;
624c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
625c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
628c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mTotalTime + (mInDischarge && mTrackingReportedValues
636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount + (mInDischarge && mTrackingReportedValues
641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mUnpluggedReportedCount);
648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUnpluggedReportedTotalTime);
650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeSummaryFromParcelLocked(out, batteryRealtime);
655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /**
669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * State for keeping track of timing information.
670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class StopwatchTimer extends Timer {
672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        final ArrayList<StopwatchTimer> mTimerPool;
673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mNesting;
674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The last time at which we updated the timer.  If mNesting is > 0,
678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * subtract this from the current battery time to find the amount of
679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * time we have been running since we last computed an update.
680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUpdateTime;
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The total time at which the timer was acquired, to determine if
685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * was actually held for an interesting duration.
686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mAcquireTime;
688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
689f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        long mTimeout;
690f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool,
692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables, Parcel in) {
693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables, in);
694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateTime = in.readLong();
696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool,
699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables) {
700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables);
701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
704f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        void setTimeout(long timeout) {
705f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mTimeout = timeout;
706f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
707f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
708c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
709c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
710c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUpdateTime);
711c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
712c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
713c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
714c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mNesting > 0) {
715c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
716c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
717c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
718c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                super.plug(batteryUptime, batteryRealtime);
719c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUpdateTime = batteryRealtime;
720c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
721c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
722c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
723c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
724c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
726c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
727c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
728c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
75432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        boolean isRunningLocked() {
75532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            return mNesting > 0;
75632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
75732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long realtime = SystemClock.elapsedRealtime() * 1000;
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final ArrayList<StopwatchTimer> pool) {
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long realtime = SystemClock.elapsedRealtime() * 1000;
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final StopwatchTimer t = pool.get(i);
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
811f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) {
812f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                curBatteryRealtime = mUpdateTime + mTimeout;
813f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount;
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> readKernelWakelockStats() {
832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        byte[] buffer = new byte[4096];
834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int len;
835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        try {
837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            FileInputStream is = new FileInputStream("/proc/wakelocks");
838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            len = is.read(buffer);
839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            is.close();
840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (len > 0) {
842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                int i;
843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (i=0; i<len; i++) {
844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (buffer[i] == '\0') {
845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        len = i;
846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        break;
847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.FileNotFoundException e) {
851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.IOException e) {
853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return parseProcWakelocks(buffer, len);
857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
859c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> parseProcWakelocks(
860c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            byte[] wlBuffer, int len) {
861c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        String name;
862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int count;
863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long totalTime;
864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int startIndex, endIndex;
865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int numUpdatedWlNames = 0;
866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        // Advance past the first line.
868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int i;
869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++);
870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        startIndex = endIndex = i + 1;
871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        synchronized(this) {
873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Map<String, KernelWakelockStats> m = mProcWakelockFileStats;
874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            sKernelWakelockUpdateVersion++;
876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            while (endIndex < len) {
877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (endIndex=startIndex;
878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0';
879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex++);
880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                endIndex++; // endIndex is an exclusive upper bound.
881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String[] nameStringArray = mProcWakelocksName;
883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                long[] wlData = mProcWakelocksData;
88453b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                boolean parsed = Process.parseProcLine(wlBuffer, startIndex, endIndex,
88553b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                        PROC_WAKELOCKS_FORMAT, nameStringArray, wlData, null);
886c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
887c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                name = nameStringArray[0];
888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                count = (int) wlData[1];
889c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // convert nanoseconds to microseconds with rounding.
890c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                totalTime = (wlData[2] + 500) / 1000;
891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
89253b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                if (parsed && name.length() > 0) {
893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (!m.containsKey(name)) {
894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        m.put(name, new KernelWakelockStats(count, totalTime,
895c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                sKernelWakelockUpdateVersion));
896c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        numUpdatedWlNames++;
897c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    } else {
898c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        KernelWakelockStats kwlStats = m.get(name);
899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        if (kwlStats.mVersion == sKernelWakelockUpdateVersion) {
900c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount += count;
901c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime += totalTime;
902c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        } else {
903c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount = count;
904c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime = totalTime;
905c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mVersion = sKernelWakelockUpdateVersion;
906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            numUpdatedWlNames++;
907c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        }
908c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
90953b707ba26055f3b7597db5826dee64987bfb83aAmith Yamasani                }
910c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                startIndex = endIndex;
911c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
912c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
913c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (m.size() != numUpdatedWlNames) {
914c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Don't report old data.
915c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Iterator<KernelWakelockStats> itr = m.values().iterator();
916c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                while (itr.hasNext()) {
917c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (itr.next().mVersion != sKernelWakelockUpdateVersion) {
918c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        itr.remove();
919c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
920c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
921c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
922c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return m;
923c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
924c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
925c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
926c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private class KernelWakelockStats {
927c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mCount;
928c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long mTotalTime;
929c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mVersion;
930c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
931c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        KernelWakelockStats(int count, long totalTime, int version) {
932c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = count;
933c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = totalTime;
934c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mVersion = version;
935c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
936c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
937c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
938c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
939c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Get the KernelWakelockTimer associated with name, and create a new one if one
940c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * doesn't already exist.
941c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
942c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public SamplingTimer getKernelWakelockTimerLocked(String name) {
943c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer kwlt = mKernelWakelockStats.get(name);
944c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kwlt == null) {
945c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
946c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    true /* track reported values */);
947c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mKernelWakelockStats.put(name, kwlt);
948c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
949c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return kwlt;
950c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
9513718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9523718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataPlug(long[] dataTransfer, long currentBytes) {
9533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        dataTransfer[STATS_LAST] = dataTransfer[STATS_UNPLUGGED];
9543718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        dataTransfer[STATS_UNPLUGGED] = -1;
9553718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9563718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9573718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataUnplug(long[] dataTransfer, long currentBytes) {
9583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        dataTransfer[STATS_UNPLUGGED] = currentBytes;
9593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9613f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
9623f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Radio uptime in microseconds when transferring data. This value is very approximate.
9633f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return
9643f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
9653f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private long getCurrentRadioDataUptime() {
9663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        try {
9673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
9683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (!awakeTimeFile.exists()) return 0;
9693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
9703718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            String line = br.readLine();
9713718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            br.close();
9723f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return Long.parseLong(line) * 1000;
9733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (NumberFormatException nfe) {
9743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
9753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (IOException ioe) {
9763718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
9773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
9783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return 0;
9793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9813f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
9823f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
9833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
9843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getRadioDataUptimeMs() {
9853f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
9863f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
9873f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
9883f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
9893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Returns the duration that the cell radio was up for data transfers.
9903f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
9913f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptime() {
9923718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (mRadioDataStart == -1) {
9933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return mRadioDataUptime;
9943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
9953f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentRadioDataUptime() - mRadioDataStart;
9963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
9973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9993f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int getCurrentBluetoothPingCount() {
10003f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBtHeadset != null) {
10013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBtHeadset.getBatteryUsageHint();
10023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
10033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return -1;
10043f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
10053f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
10063f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public int getBluetoothPingCount() {
10073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBluetoothPingStart == -1) {
10083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBluetoothPingCount;
10093f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        } else if (mBtHeadset != null) {
10103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentBluetoothPingCount() - mBluetoothPingStart;
10113f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
101282cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        return 0;
10133f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
10143f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
10153f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public void setBtHeadset(BluetoothHeadset headset) {
101682cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        if (headset != null && mBtHeadset == null && isOnBattery() && mBluetoothPingStart == -1) {
101782cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani            mBluetoothPingStart = getCurrentBluetoothPingCount();
101882cb029e2a4907ee55fed4a00493b76b3e11a7a1Amith Yamasani        }
10193f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBtHeadset = headset;
10203f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
10213f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doUnplug(long batteryUptime, long batteryRealtime) {
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesReceived = NetStat.getUidRxBytes(u.mUid);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesSent = NetStat.getUidTxBytes(u.mUid);
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track total mobile data
10343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataUnplug(mMobileDataRx, NetStat.getMobileRxBytes());
10353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataUnplug(mMobileDataTx, NetStat.getMobileTxBytes());
10363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataUnplug(mTotalDataRx, NetStat.getTotalRxBytes());
10373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataUnplug(mTotalDataTx, NetStat.getTotalTxBytes());
10383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
10393f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataStart = getCurrentRadioDataUptime();
10403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = 0;
10413f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
10423f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = getCurrentBluetoothPingCount();
10433f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = 0;
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doPlug(long batteryUptime, long batteryRealtime) {
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataPlug(mMobileDataRx, NetStat.getMobileRxBytes());
10623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataPlug(mMobileDataTx, NetStat.getMobileTxBytes());
10633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataPlug(mTotalDataRx, NetStat.getTotalRxBytes());
10643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataPlug(mTotalDataTx, NetStat.getTotalTxBytes());
10653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
10663f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataUptime = getRadioDataUptime();
10673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
10683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
10693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
10703f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = getBluetoothPingCount();
10713f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10733718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
10752e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStartGps();
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
10792e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStopGps();
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
1086617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1087617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this);
1088617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
1096617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1097617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1098617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1099617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1100617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1102617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightnessLocked(int brightness) {
1103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Bin the brightness.
1104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
1105617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (bin < 0) bin = 0;
1106617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
1107617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mScreenBrightnessBin != bin) {
1108617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenOn) {
1109617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (mScreenBrightnessBin >= 0) {
1110617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1111617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1112617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[bin].startRunningLocked(this);
1113617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1114617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessBin = bin;
1115617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1116617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1117617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1118617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteInputEventLocked() {
1119617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.stepLocked();
1120617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1121617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1122617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivityLocked(int uid, int event) {
11232e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteUserActivityLocked(event);
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
113932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1140f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    /**
1141f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * Telephony stack updates the phone state.
1142f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     * @param state phone state from ServiceState.getState()
1143f37447bad3773b62176baa837908daf6edb44273Amith Yamasani     */
1144f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneStateLocked(int state) {
1145f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        int bin = mPhoneSignalStrengthBin;
1146f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        boolean isAirplaneMode = state == ServiceState.STATE_POWER_OFF;
1147f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        // Stop all timers
1148f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (isAirplaneMode || state == ServiceState.STATE_OUT_OF_SERVICE) {
1149f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) {
1150f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) {
1151f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                    mPhoneSignalStrengthsTimer[i].stopRunningLocked(this);
115232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                }
115332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            }
115432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
1155f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        // Stop Signal Scanning timer, in case we're going into service
1156f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        while (mPhoneSignalScanningTimer.isRunningLocked()) {
1157f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.stopRunningLocked(this);
1158f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
1159f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1160f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        // If we're back in service or continuing in service, restart the old timer.
1161f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (state == ServiceState.STATE_IN_SERVICE) {
1162f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (bin == -1) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1163f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) {
1164f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1165f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1166f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        } else if (state == ServiceState.STATE_OUT_OF_SERVICE) {
1167f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalStrengthBin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1168f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].isRunningLocked()) {
1169f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].startRunningLocked(this);
1170f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1171f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (!mPhoneSignalScanningTimer.isRunningLocked()) {
1172f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                mPhoneSignalScanningTimer.startRunningLocked(this);
1173f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            }
1174f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
1175f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneServiceState = state;
117632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
117732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1178e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
1179627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
1180627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin;
1181f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneServiceState == ServiceState.STATE_POWER_OFF
1182f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                || mPhoneServiceState == ServiceState.STATE_OUT_OF_SERVICE) {
1183f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            // Ignore any signal strength changes when radio was turned off or out of service.
1184f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            return;
1185f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
1186e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (!signalStrength.isGsm()) {
1187e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            int dBm = signalStrength.getCdmaDbm();
1188f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            if (dBm >= -75) bin = SIGNAL_STRENGTH_GREAT;
1189f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else if (dBm >= -85) bin = SIGNAL_STRENGTH_GOOD;
1190f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else if (dBm >= -95)  bin = SIGNAL_STRENGTH_MODERATE;
1191f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else if (dBm >= -100)  bin = SIGNAL_STRENGTH_POOR;
1192f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            else bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1193e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        } else {
1194e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            int asu = signalStrength.getGsmSignalStrength();
1195e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1196e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT;
1197e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 8)  bin = SIGNAL_STRENGTH_GOOD;
1198e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 4)  bin = SIGNAL_STRENGTH_MODERATE;
1199e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else bin = SIGNAL_STRENGTH_POOR;
1200e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1201627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
1202627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
1203627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
1204627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1205627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthBin = bin;
1206627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1207627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1208627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1209627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1210627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
1211627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
1212627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
1213627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
1214627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
1215627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
1216627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1217627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
1218627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
1219627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1220627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
1221627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
1222627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1223627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
1224627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
1225627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1226627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1227627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
12283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData);
1229627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
1230627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
1231627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
1232627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1233627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
1234627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
1235627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1236627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1237627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOnLocked(int uid) {
1239105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
1240105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
1241105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
1242105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid != uid) {
1244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mWifiOnUid >= 0) {
12452e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn                getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked();
1246617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1247617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = uid;
12482e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn            getUidStatsLocked(uid).noteWifiTurnedOnLocked();
1249617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOffLocked(int uid) {
1253105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
1254105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
1255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
1256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid >= 0) {
12582e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn            getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked();
1259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = -1;
1260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1261105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1262244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1263244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOnLocked(int uid) {
1264244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mAudioOn) {
1265244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = true;
1266244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.startRunningLocked(this);
1267244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
12682e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOnLocked();
1269244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1270105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1271244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOffLocked(int uid) {
1272244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mAudioOn) {
1273244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = false;
1274244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.stopRunningLocked(this);
1275244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
12762e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOffLocked();
1277244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1278244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1279244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOnLocked(int uid) {
1280244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mVideoOn) {
1281244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = true;
1282244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.startRunningLocked(this);
1283244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
12842e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOnLocked();
1285244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1286244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1287244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOffLocked(int uid) {
1288244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mVideoOn) {
1289244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = false;
1290244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.stopRunningLocked(this);
1291244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
12922e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOffLocked();
1293244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1294244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1295d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiRunningLocked() {
1296d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (!mWifiRunning) {
1297d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = true;
1298d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.startRunningLocked(this);
1299d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1300d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1301d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1302d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiStoppedLocked() {
1303d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (mWifiRunning) {
1304d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = false;
1305d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.stopRunningLocked(this);
1306d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1307d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1308d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1309105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
1310105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
1311105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
1312105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
1313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1314105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1315105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1316105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
1317105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
1318105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
1319105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
1320105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1321105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1322105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1323105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
13242e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked();
1325105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1326105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1327105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
13282e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockReleasedLocked();
1329105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1330105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1331105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
13322e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked();
1333105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1334105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1335105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
13362e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockReleasedLocked();
1337105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
13385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
13395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabledLocked(int uid) {
13402e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastEnabledLocked();
13415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
13425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
13435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabledLocked(int uid) {
13442e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastDisabledLocked();
13455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
13465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
1348c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which);
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public long getScreenBrightnessTime(int brightnessBin,
1352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which) {
1353c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
1354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                batteryRealtime, which);
1355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1356244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getInputEventCount(int which) {
1358c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mInputEventCounter.getCountLocked(which);
1359617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1360617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
1362c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which);
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1364244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1365627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
1366627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
1367c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
1368627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
1369627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1370f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1371f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    @Override public long getPhoneSignalScanningTime(
1372f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            long batteryRealtime, int which) {
1373f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        return mPhoneSignalScanningTimer.getTotalTimeLocked(
1374f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                batteryRealtime, which);
1375f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
1376f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
1377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneSignalStrengthCount(int dataType, int which) {
1378c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
1379617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1380617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1381627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
1382627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
1383c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
1384627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
1385627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1386627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1387617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneDataConnectionCount(int dataType, int which) {
1388c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
1389617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1390617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1391105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
1392c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which);
1393105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1394105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1395d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    @Override public long getWifiRunningTime(long batteryRealtime, int which) {
1396c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
1397d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1398d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1399105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
1400c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which);
1401105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1402105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        boolean mWifiTurnedOn;
1430c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mWifiTurnedOnTimer;
1431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1432105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
1433c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mFullWifiLockTimer;
1434105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1435105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
1436c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mScanWifiLockTimer;
1437244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
14385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        boolean mWifiMulticastEnabled;
14395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        StopwatchTimer mWifiMulticastTimer;
1440244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1441244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mAudioTurnedOn;
1442244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mAudioTurnedOnTimer;
1443244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1444244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mVideoTurnedOn;
1445244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mVideoTurnedOnTimer;
14465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
1447617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter[] mUserActivityCounters;
1448617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
1471c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables);
1472c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables);
1473c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables);
14745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED,
14755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables);
1476244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables);
1477244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables);
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1499eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1500eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1504eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1505eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1524eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1525eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1541617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteWifiTurnedOnLocked() {
1542617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (!mWifiTurnedOn) {
1543617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOn = true;
1544617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1545617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1546617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1547617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1548617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1549617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteWifiTurnedOffLocked() {
1550617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mWifiTurnedOn) {
1551617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOn = false;
1552617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1553617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1554617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1555617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1556617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1557105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
1558105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
1559105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
1560105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
1561105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1562105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1563105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1564105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1565244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteVideoTurnedOnLocked() {
1566244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (!mVideoTurnedOn) {
1567244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOn = true;
1568244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1569244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1570244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1571244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1572244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1573244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteVideoTurnedOffLocked() {
1574244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (mVideoTurnedOn) {
1575244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOn = false;
1576244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1577244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1578244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1579244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1580244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1581244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteAudioTurnedOnLocked() {
1582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (!mAudioTurnedOn) {
1583244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOn = true;
1584244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1585244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1586244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1587244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1588244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1589244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteAudioTurnedOffLocked() {
1590244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (mAudioTurnedOn) {
1591244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOn = false;
1592244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1593244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1594244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1595244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1596244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1597105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
1598105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
1599105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
1600105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
1601105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1602105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1603105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1604105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1605105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
1606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
1607105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
1608105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
1609105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1610105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1611105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1612105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1613105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
1614105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
1615105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
1616105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
1617105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1618105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
16195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
16205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
16215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastEnabledLocked() {
16225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (!mWifiMulticastEnabled) {
16235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = true;
16245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this);
16255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
16265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
16275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
16285347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
16295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastDisabledLocked() {
16305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (mWifiMulticastEnabled) {
16315347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = false;
16325347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this);
16335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
16345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
16355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
1636617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1637617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public long getWifiTurnedOnTime(long batteryRealtime, int which) {
1638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mWifiTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1639617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1640244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1641244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1642244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public long getAudioTurnedOnTime(long batteryRealtime, int which) {
1643244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1644244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public long getVideoTurnedOnTime(long batteryRealtime, int which) {
1648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1650244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1651105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1652105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
1653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
1654105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1655105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1657105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
1658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
1659105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
16605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
16615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
16625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public long getWifiMulticastTime(long batteryRealtime, int which) {
16635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime,
16645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                          which);
16655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
16665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
1667617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1668617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteUserActivityLocked(int type) {
1669617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1670617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                initUserActivityLocked();
1671617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1672617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (type < 0) type = 0;
1673617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1;
1674617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters[type].stepLocked();
1675617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1676617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1677617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1678617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
1679617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
1680617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1681617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1682617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1683617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
1684617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1685617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
1686617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
1688617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1689617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1690617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
1691617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
1692617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1693617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
1694617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1695617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1696617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1701244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
1737617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime);
1738105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
1739244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime);
1740244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime);
1741105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
17425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastTimer.writeToParcel(out, batteryRealtime);
1743617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1744617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
1745617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
1746617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
1747617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1748617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
1749617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1750617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(wakelockName, wakelock);
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
1796617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiTurnedOn = false;
1797c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables, in);
1798105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
1799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables, in);
1800244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOn = false;
1801244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables, in);
1802244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOn = false;
1803244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables, in);
1804105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
1805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables, in);
18065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastEnabled = false;
18075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED,
18085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables, in);
1809617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() == 0) {
1810617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = null;
1811617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
1812617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
1813617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1814617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
1815617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1816617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return new StopwatchTimer(type, pool, unpluggables, in);
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
1882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
1896c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return new StopwatchTimer(0, pool, unpluggables, in);
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1914eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1915eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1941eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Amount of time the process was running in the foreground.
1942eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
1943eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mForegroundTime;
1944eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1945eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1961eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from a previous save.
1962eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
1963eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLoadedForegroundTime;
1964eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1965eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1981eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from the previous run
1982eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
1983eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLastForegroundTime;
1984eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1985eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2000eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
2001eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time since unplugged.
2002eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
2003eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mUnpluggedForegroundTime;
2004eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2005e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            SamplingCounter[] mSpeedBins;
2006e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
2009e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[getCpuSpeedSteps()];
2010e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
2011e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    mSpeedBins[i] = new SamplingCounter(mUnpluggables);
2012e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2014e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
2019eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = mForegroundTime;
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
2026105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
2027105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
2028105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
2031eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mForegroundTime);
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
2035eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLoadedForegroundTime);
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastUserTime);
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastSystemTime);
2039eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLastForegroundTime);
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastStarts);
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
2043eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mUnpluggedForegroundTime);
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
2045e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2046e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                out.writeInt(mSpeedBins.length);
2047e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length; i++) {
2048e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    mSpeedBins[i].writeToParcel(out);
2049e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
2055eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime = in.readLong();
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
2059eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLoadedForegroundTime = in.readLong();
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastUserTime = in.readLong();
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastSystemTime = in.readLong();
2063eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLastForegroundTime = in.readLong();
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastStarts = in.readInt();
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
2067eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = in.readLong();
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
2069e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2070e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                int bins = in.readInt();
2071e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                mSpeedBins = new SamplingCounter[bins];
2072e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < bins; i++) {
2073e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    mSpeedBins[i] = new SamplingCounter(mUnpluggables, in);
2074e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2086eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public void addForegroundTimeLocked(long ttime) {
2087eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime += ttime;
2088eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
2089eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
2127eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public long getForegroundTime(int which) {
2128eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                long val;
2129eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                if (which == STATS_LAST) {
2130eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mLastForegroundTime;
2131eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                } else {
2132eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mForegroundTime;
2133eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    if (which == STATS_CURRENT) {
2134eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mLoadedForegroundTime;
2135eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    } else if (which == STATS_UNPLUGGED) {
2136eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mUnpluggedForegroundTime;
2137eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    }
2138eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                }
2139eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                return val;
2140eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
2141eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2142eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2157e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2158e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            /* Called by ActivityManagerService when CPU times are updated. */
2159e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public void addSpeedStepTimes(long[] values) {
2160e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                for (int i = 0; i < mSpeedBins.length && i < values.length; i++) {
2161e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    mSpeedBins[i].addCountLocked(values[i]);
2162e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
2163e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
2164e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2165e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            @Override
2166e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            public long getTimeAtCpuSpeedStep(int speedStep, int which) {
2167e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                if (speedStep < mSpeedBins.length) {
2168e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return mSpeedBins[speedStep].getCountLocked(which);
2169e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                } else {
2170e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                    return 0;
2171e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani                }
2172e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani            }
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWakeups = in.readInt();
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastWakeups);
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStartTime = in.readLong();
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStarts = in.readInt();
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastLaunches = in.readInt();
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLastStartTime);
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastStarts);
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastLaunches);
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wl = new Wakelock();
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(name, wl);
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_PARTIAL, mPartialTimers, mUnpluggables);
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_FULL, mFullTimers, mUnpluggables);
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_WINDOW, mWindowTimers, mUnpluggables);
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
2632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            t = new StopwatchTimer(BatteryStats.SENSOR, timers, mUnpluggables);
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartWakeLocked(String name, int type) {
2641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopWakeLocked(String name, int type) {
2648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
2655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
2663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
2670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
2677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
2680244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = new File(filename);
26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBackupFile = new File(filename + ".bak");
26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
2692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables);
2693617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
2694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables);
2695617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2696617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
2697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables);
2698627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables);
2700627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2701f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer = new StopwatchTimer(-200+1, null, mUnpluggables);
2702627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2703c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables);
2704627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2705c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiOnTimer = new StopwatchTimer(-3, null, mUnpluggables);
2706c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiRunningTimer = new StopwatchTimer(-4, null, mUnpluggables);
2707c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mBluetoothOnTimer = new StopwatchTimer(-5, null, mUnpluggables);
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
2715633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
2716633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2724e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public void setNumSpeedSteps(int steps) {
2725e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        if (sNumSpeedSteps == 0) sNumSpeedSteps = steps;
2726e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
2727e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
2728f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void setRadioScanningTimeout(long timeout) {
2729f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        if (mPhoneSignalScanningTimer != null) {
2730f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.setTimeout(timeout);
2731f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        }
2732f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    }
2733f37447bad3773b62176baa837908daf6edb44273Amith Yamasani
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2743105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnBattery(boolean onBattery, int level) {
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
2745c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            updateKernelWakelocksLocked();
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnBattery != onBattery) {
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOnBattery = mOnBatteryInternal = onBattery;
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long uptime = SystemClock.uptimeMillis() * 1000;
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mSecRealtime = SystemClock.elapsedRealtime();
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long realtime = mSecRealtime * 1000;
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (onBattery) {
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryUptimeStart = uptime;
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryRealtimeStart = realtime;
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
2757633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    mDischargeCurrentLevel = mDischargeStartLevel = level;
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doUnplug(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
2762633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    mDischargeCurrentLevel = level;
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doPlug(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mLastWriteTime + (60 * 1000)) < mSecRealtime) {
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mFile != null) {
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        writeLocked();
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2773633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
2774633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public void recordCurrentLevel(int level) {
2775633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = level;
2776633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
2777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
2779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
2780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2781d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        if (m == null) {
2782d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            // Not crashing might make board bringup easier.
2783d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            Log.w(TAG, "Couldn't get kernel wake lock stats");
2784d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            return;
2785d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        }
2786d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen
2787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
2788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
2789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
2790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
2792c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
2793c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
2794c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
2795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
2796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
2797c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
2798c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
2799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
2800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
2801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
2803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
2804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
2805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
2806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
2807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
2808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
2809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
2810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
2811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mUptime + (curTime-mUptimeStart);
28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart);
28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
29033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long getTcpBytes(long current, long[] dataBytes, int which) {
29043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (which == STATS_LAST) {
29053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return dataBytes[STATS_LAST];
29063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
29073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (which == STATS_UNPLUGGED) {
29083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                if (dataBytes[STATS_UNPLUGGED] < 0) {
29093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return dataBytes[STATS_LAST];
29103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                } else {
29113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return current - dataBytes[STATS_UNPLUGGED];
29123718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                }
29133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            } else if (which == STATS_TOTAL) {
29143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_TOTAL];
29153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            }
29163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return current - dataBytes[STATS_CURRENT];
29173718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
29183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
29193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
29203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
29213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesSent(int which) {
29223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return getTcpBytes(NetStat.getMobileTxBytes(), mMobileDataTx, which);
29233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
29243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
29253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
29263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesReceived(int which) {
29273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return getTcpBytes(NetStat.getMobileRxBytes(), mMobileDataRx, which);
29283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
29293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
29303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
29313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesSent(int which) {
29323718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return getTcpBytes(NetStat.getTotalTxBytes(), mTotalDataTx, which);
29333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
29343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
29353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
29363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesReceived(int which) {
29373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return getTcpBytes(NetStat.getTotalRxBytes(), mTotalDataRx, which);
29383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
29393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2940105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
2941633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
2942105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
2943633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
2944105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2945105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2946105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2947633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
2948633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return mDischargeStartLevel;
2949105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2950105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2951105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
2952633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
2953105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
2954633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
2955105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2956105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2957105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2958633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
2959633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return mDischargeCurrentLevel;
2960105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2962e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    @Override
2963e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    public int getCpuSpeedSteps() {
2964e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        return sNumSpeedSteps;
2965e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani    }
2966e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
298532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
299632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * Retrieve the statistics object for a particular process, given
299732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * the name of the process.
299832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @param name process name
299932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @return the statistics object for the process
300032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     */
3001819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public Uid.Proc getProcessStatsLocked(String name, int pid) {
300232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        int uid;
300332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (mUidCache.containsKey(name)) {
300432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            uid = mUidCache.get(name);
300532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        } else {
3006819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani            uid = Process.getUidForPid(pid);
300732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            mUidCache.put(name, uid);
300832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
300932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        Uid u = getUidStatsLocked(uid);
301032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        return u.getProcessStatsLocked(name);
301132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
301232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
301332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    /**
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeLocked() {
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "writeLocked: no file associated with this instance");
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Keep the old file around until we know the new one has
30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been successfully written.
30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFile.exists()) {
30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mBackupFile.exists()) {
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBackupFile.delete();
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30438550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu            if (!mFile.renameTo(mBackupFile)) {
30448550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu                Log.w("BatteryStats", "Failed to back up file before writing new stats");
30458550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu                return;
30468550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu            }
30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream stream = new FileOutputStream(mFile);
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel out = Parcel.obtain();
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            writeSummaryToParcel(out);
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.write(out.marshall());
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.recycle();
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBackupFile.delete();
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastWriteTime = SystemClock.elapsedRealtime();
30618550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu            return;
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
30638550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu            Log.w("BatteryStats", "Error writing battery statistics", e);
30648550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu        }
30658550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu        if (mFile.exists()) {
30668550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu            if (!mFile.delete()) {
30678550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu                Log.w(TAG, "Failed to delete mangled file " + mFile);
30688550f255232eb4e4852466c5297fdc125887f5afSuchi Amalapurapu            }
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readLocked: no file associated with this instance");
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileInputStream stream = null;
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBackupFile.exists()) {
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mBackupFile);
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (java.io.IOException e) {
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We'll try for the normal settings file.
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (stream == null) {
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mFile.exists()) {
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mFile);
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e("BatteryStats", "Error reading battery statistics", e);
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readFromParcel: version got " + version
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
3153633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = in.readInt();
3154633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
3155105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
3160617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3161617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
3162617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3163617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
3166627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3167627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
3168627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3169f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in);
3170627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3171627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
3172627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3173105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
3174105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
3175d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
3176d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.readSummaryFromParcelLocked(in);
3177105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
3178105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3180c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
3181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
3182c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
3183c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
3184c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
3185c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3186c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3187e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3188e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
3189e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3196617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOn = false;
3197617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in);
3198105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
3199105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
3200244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mAudioTurnedOn = false;
3201244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in);
3202244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mVideoTurnedOn = false;
3203244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in);
3204105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
3205105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
32065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastEnabled = false;
32075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
32085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
3209617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
3210617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
3211617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
3212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
3213617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
3214617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
3215617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
3216617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
3217617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastUserTime = in.readLong();
32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastSystemTime = in.readLong();
32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastStarts = in.readInt();
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastWakeups = in.readInt();
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStartTime = in.readLong();
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStarts = in.readInt();
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastLaunches = in.readInt();
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL));
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT));
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL));
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT));
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL));
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT));
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL));
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT));
3300633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeStartLevel);
3301633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
3302105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3306617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
3307617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3308617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3310627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3311627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
3312627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3313f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3314627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3315627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
3316627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3317105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3318d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3319105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3321c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
3322c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
3323c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
3324c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
3325c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
3326c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
3327c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
3328c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
3329c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
3330c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3331c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3332c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3333e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
3339105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3340617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3341105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3342c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani            u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3343c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani            u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3344105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
33455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL);
33469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3347617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
3348617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
3349617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
3350617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
3351617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
3352617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
3353617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
3354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
3355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
33789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
33799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
33809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
33819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
33919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
33929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
33939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
33949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
33959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime - ps.mLoadedUserTime);
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime);
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts - ps.mLoadedStarts);
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups - ps.mLoadedWakeups);
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
34329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
34339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time - ss.mLoadedStartTime);
34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts - ss.mLoadedStarts);
34379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches - ss.mLoadedLaunches);
34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesReceived(STATS_TOTAL));
34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesSent(STATS_TOTAL));
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
3465c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables, in);
3466617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3467c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables, in);
3468617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3469617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
3471c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
3472627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3473c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables, in);
3474627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3475f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer = new StopwatchTimer(-200+1, null, mUnpluggables, in);
3476627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables, in);
3478627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3479105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
3480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
3481d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
3482c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiRunningTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
3483105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
3484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mBluetoothOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
3499633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = in.readInt();
3500633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_LAST] = in.readLong();
35043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_UNPLUGGED] = -1;
35053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_LAST] = in.readLong();
35063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_UNPLUGGED] = -1;
35073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_LAST] = in.readLong();
35083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_UNPLUGGED] = -1;
35093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_LAST] = in.readLong();
35103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_UNPLUGGED] = -1;
35113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
35123718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = in.readLong();
35133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
35143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
35153f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = in.readInt();
35163f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
35173f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
3518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
3519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
3520c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
3521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
3522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
3523244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel
3524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
3525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
3526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
35299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
35309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
35319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
35329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3533e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        sNumSpeedSteps = in.readInt();
3534e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
35379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
35389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
35399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
35409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
35419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
35429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
35469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeToParcelLocked(out, flags);
35479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
35509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writeToParcelLocked(Parcel out, int flags) {
35519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
35529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
35539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
35549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
35559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
35579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
35589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
35599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastUptime);
35609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
35619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastRealtime);
35629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
3563617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3564617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
3565617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3566617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
35679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
3568627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3569627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
3570627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3571f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mPhoneSignalScanningTimer.writeToParcel(out, batteryRealtime);
3572627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3573627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
3574627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3575105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
3576d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeToParcel(out, batteryRealtime);
3577105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
35789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
35799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
35809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastUptime);
35819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
35829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
35839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastRealtime);
35849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
35859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
35869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
35879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
35889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
35899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
35909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
3591633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeStartLevel);
3592633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
35939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
35949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getMobileTcpBytesReceived(STATS_UNPLUGGED));
35963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getMobileTcpBytesSent(STATS_UNPLUGGED));
35973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getTotalTcpBytesReceived(STATS_UNPLUGGED));
35983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getTotalTcpBytesSent(STATS_UNPLUGGED));
35993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
36003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Write radio uptime for data
36013f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeLong(getRadioDataUptime());
36023f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
36033f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeInt(getBluetoothPingCount());
36043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
3605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
3606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
3607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = ent.getValue();
3608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
3609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
3610c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
3611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
3612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
3613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
3614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3616e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
3617e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        out.writeInt(sNumSpeedSteps);
3618e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani
36199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int size = mUidStats.size();
36209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(size);
36219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < size; i++) {
36229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(i));
36239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid uid = mUidStats.valueAt(i);
36249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uid.writeToParcelLocked(out, batteryRealtime);
36269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
36309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
36319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
36329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
36339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
36369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
36379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
36399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
36401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
36419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
36421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
36431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
36441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
3645617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
36461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
36471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
3648617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
36491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
36501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
36511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
36521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
3653627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
36541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
36551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
3656627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
3657f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            pr.println("*** Signal scanning :");
3658f37447bad3773b62176baa837908daf6edb44273Amith Yamasani            mPhoneSignalScanningTimer.logState(pr, "  ");
3659627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
36601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
36611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
36621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
36631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
36641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
36651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
36661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiRunningTimer.logState(pr, "  ");
36671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
36681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
36699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
36709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
36719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
36729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3673