BatteryStatsImpl.java revision 3f7e35c2c7d3d7f08f50c1d93cd16b1f49354ccc
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;
27e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
28627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
343718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.BufferedReader;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasaniimport java.io.FileReader;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
43c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private static final int VERSION = 39;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mFile;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mBackupFile;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
74c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>();
75c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>();
76c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>();
77c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers
78c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            = new SparseArray<ArrayList<StopwatchTimer>>();
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
99c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mScreenOnTimer;
1003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mScreenBrightnessBin = -1;
102c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
104617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    Counter mInputEventCounter;
105617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
107c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mPhoneOnTimer;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
109244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mAudioOn;
110244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mAudioOnTimer;
111244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
112244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    boolean mVideoOn;
113244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    StopwatchTimer mVideoOnTimer;
114244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
115627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneSignalStrengthsTimer =
117c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS];
118627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
119627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneDataConnectionsTimer =
121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
122627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
123105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
124c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiOnTimer;
125617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mWifiOnUid = -1;
126d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
127d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    boolean mWifiRunning;
128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiRunningTimer;
129105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
130105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
131c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mBluetoothOnTimer;
1323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /** Bluetooth headset object */
1343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    BluetoothHeadset mBtHeadset;
1353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
1463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
1493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
150105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
151105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
152105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
153633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeStartLevel;
154633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeCurrentLevel;
155244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
157244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1583718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    // Mobile data transferred while on battery
1593718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataTx = new long[4];
1603718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mMobileDataRx = new long[4];
1613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataTx = new long[4];
1623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long[] mTotalDataRx = new long[4];
1633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
1643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataUptime;
1653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long mRadioDataStart;
1663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
1673f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingCount;
1683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int mBluetoothPingStart = -1;
1693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
170c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
171c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
172c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
173c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final HashMap<String, SamplingTimer> mKernelWakelockStats =
174c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, SamplingTimer>();
175c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public Map<String, ? extends SamplingTimer> getKernelWakelockStats() {
177c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mKernelWakelockStats;
178c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
179c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
180c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static int sKernelWakelockUpdateVersion = 0;
181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
182c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int[] PROC_WAKELOCKS_FORMAT = new int[] {
183c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
184c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 1: count
185c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
186c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
187c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
188c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 5: totalTime
189c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    };
190c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
191c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final String[] mProcWakelocksName = new String[3];
192c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final long[] mProcWakelocksData = new long[3];
193c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
195c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added
196c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * to mKernelWakelockStats.
197c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
198c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> mProcWakelockFileStats =
199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, KernelWakelockStats>();
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    private HashMap<String, Integer> mUidCache = new HashMap<String, Integer>();
20232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
214617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
215617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
216617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final class Counter extends BatteryStats.Counter implements Unpluggable {
217617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mCount;
218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLoadedCount;
219617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLastCount;
220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mUnpluggedCount;
221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mPluggedCount;
222617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
223617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables, Parcel in) {
224617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mPluggedCount = mCount = in.readInt();
225617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLoadedCount = in.readInt();
226617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLastCount = in.readInt();
227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = in.readInt();
228617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
229617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
230617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
231617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables) {
232617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
233617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
234617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
235617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void writeToParcel(Parcel out) {
236617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mCount);
237617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLoadedCount);
238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLastCount);
239617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mUnpluggedCount);
240617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
241617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
242617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void unplug(long batteryUptime, long batteryRealtime) {
243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = mCount = mPluggedCount;
244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
245617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
246617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void plug(long batteryUptime, long batteryRealtime) {
247617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mPluggedCount = mCount;
248617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
249617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
250617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
251617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Writes a possibly null Counter to a Parcel.
252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
253617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param out the Parcel to be written to.
254617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param counter a Counter, or null.
255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static void writeCounterToParcel(Parcel out, Counter counter) {
257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (counter == null) {
258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0); // indicates null
259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return;
260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(1); // indicates non-null
262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            counter.writeToParcel(out);
264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
267c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
268617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            int val;
269617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (which == STATS_LAST) {
270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mLastCount;
271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
272617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mCount;
273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (which == STATS_UNPLUGGED) {
274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mUnpluggedCount;
275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                } else if (which != STATS_TOTAL) {
276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mLoadedCount;
277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return val;
281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void logState(Printer pw, String prefix) {
284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            pw.println(prefix + "mCount=" + mCount
285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mUnpluggedCount=" + mUnpluggedCount
287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mPluggedCount=" + mPluggedCount);
288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void stepLocked() {
291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mCount++;
292617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
294617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void writeSummaryFromParcelLocked(Parcel out) {
295617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mCount);
296617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mCount - mLoadedCount);
297617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
298617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void readSummaryFromParcelLocked(Parcel in) {
300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mCount = mLoadedCount = in.readInt();
301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLastCount = in.readInt();
302617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = mPluggedCount = mCount;
303617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
304617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
306617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
309c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static abstract class Timer extends BatteryStats.Timer implements Unpluggable {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
311c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
347244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        /**
348244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * Constructs from a parcel.
349244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param type
350244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param unpluggables
351244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param powerType
352244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         * @param in
353244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani         */
354c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) {
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
356c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastCount = in.readInt();
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTime = in.readLong();
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
368c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables) {
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
372c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
373c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract long computeRunTimeLocked(long curBatteryRealtime);
374c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
375c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract int computeCurrentCountLocked();
376c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLastCount);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLastTime);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
405c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
406c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
407c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " old mTotalTime=" + mTotalTime);
408c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
409c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = computeRunTimeLocked(batteryRealtime);
410c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = computeCurrentCountLocked();
411c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
412c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType
413c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + ": new mTotalTime=" + mTotalTime);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
435c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long getTotalTimeLocked(long batteryRealtime, int which) {
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
452c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                val = computeCurrentCountLocked();
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
468627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
469c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + " mCount=" + mCount
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
472627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
474627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
476c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
478c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
479c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long runTime = computeRunTimeLocked(batteryRealtime);
481c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Divide by 1000 for backwards compatibility
482c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong((runTime + 500) / 1000);
483c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(((runTime - mLoadedTime) + 500) / 1000);
484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount);
485c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount - mLoadedCount);
486c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
487c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
488c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
489c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Multiply by 1000 for backwards compatibility
490c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = mLoadedTime = in.readLong() * 1000;
491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mLastTime = in.readLong() * 1000;
492c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedTime = mTotalTime;
493c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = mLoadedCount = in.readInt();
494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mLastCount = in.readInt();
495c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedCount = mCount;
496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
497c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
498c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
499c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class SamplingTimer extends Timer {
500c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
501c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
502c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported count from /proc/wakelocks.
503c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
504c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mCurrentReportedCount;
505c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
506c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
507c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported count from /proc/wakelocks when unplug() was last
508c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
509c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
510c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUnpluggedReportedCount;
511c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
512c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
513c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported total_time from /proc/wakelocks.
514c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
515c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mCurrentReportedTotalTime;
516c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
517c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported total_time from /proc/wakelocks when unplug() was last
520c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUnpluggedReportedTotalTime;
523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently in a discharge cycle.
526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mInDischarge;
528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
529c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently recording reported values.
531c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
532c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mTrackingReportedValues;
533c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
534c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /*
535c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * A sequnce counter, incremented once for each update of the stats.
536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUpdateVersion;
538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) {
540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables, in);
541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = in.readInt();
542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = in.readInt();
543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = in.readLong();
544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = in.readLong();
545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge,
550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                boolean trackReportedValues) {
551c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables);
552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = trackReportedValues;
553c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
556c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setStale() {
557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = false;
558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = 0;
559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = 0;
560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setUpdateVersion(int version) {
563c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateVersion = version;
564c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getUpdateVersion() {
567c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUpdateVersion;
568c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
569c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedCount(int count) {
571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedCount == 0) {
572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = count;
574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = count;
578c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
579c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
580c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedTotalTime(long totalTime) {
581c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedTotalTime == 0) {
582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = totalTime;
584c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
585c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
586c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = totalTime;
588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void unplug(long batteryUptime, long batteryRealtime) {
591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.unplug(batteryUptime, batteryRealtime);
592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mTrackingReportedValues) {
593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = mCurrentReportedCount;
595c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = true;
597c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
598c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.plug(batteryUptime, batteryRealtime);
601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = false;
602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
603c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
610c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mTotalTime + (mInDischarge && mTrackingReportedValues
614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount + (mInDischarge && mTrackingReportedValues
619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
620c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
623c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
624c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
625c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mUnpluggedReportedCount);
626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUnpluggedReportedTotalTime);
628c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeSummaryFromParcelLocked(out, batteryRealtime);
633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /**
647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * State for keeping track of timing information.
648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class StopwatchTimer extends Timer {
650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        final ArrayList<StopwatchTimer> mTimerPool;
651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mNesting;
652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The last time at which we updated the timer.  If mNesting is > 0,
656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * subtract this from the current battery time to find the amount of
657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * time we have been running since we last computed an update.
658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUpdateTime;
660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The total time at which the timer was acquired, to determine if
663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * was actually held for an interesting duration.
664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mAcquireTime;
666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool,
668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables, Parcel in) {
669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables, in);
670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateTime = in.readLong();
672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool,
675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables) {
676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables);
677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUpdateTime);
683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mNesting > 0) {
687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                super.plug(batteryUptime, batteryRealtime);
691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUpdateTime = batteryRealtime;
692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
72632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        boolean isRunningLocked() {
72732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            return mNesting > 0;
72832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
72932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long realtime = SystemClock.elapsedRealtime() * 1000;
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final ArrayList<StopwatchTimer> pool) {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long realtime = SystemClock.elapsedRealtime() * 1000;
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final StopwatchTimer t = pool.get(i);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> readKernelWakelockStats() {
801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        byte[] buffer = new byte[4096];
803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int len;
804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        try {
806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            FileInputStream is = new FileInputStream("/proc/wakelocks");
807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            len = is.read(buffer);
808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            is.close();
809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (len > 0) {
811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                int i;
812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (i=0; i<len; i++) {
813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (buffer[i] == '\0') {
814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        len = i;
815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        break;
816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.FileNotFoundException e) {
820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.IOException e) {
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return parseProcWakelocks(buffer, len);
826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> parseProcWakelocks(
829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            byte[] wlBuffer, int len) {
830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        String name;
831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int count;
832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long totalTime;
833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int startIndex, endIndex;
834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int numUpdatedWlNames = 0;
835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        // Advance past the first line.
837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int i;
838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++);
839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        startIndex = endIndex = i + 1;
840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        synchronized(this) {
842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Map<String, KernelWakelockStats> m = mProcWakelockFileStats;
843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            sKernelWakelockUpdateVersion++;
845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            while (endIndex < len) {
846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (endIndex=startIndex;
847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0';
848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex++);
849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                endIndex++; // endIndex is an exclusive upper bound.
850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String[] nameStringArray = mProcWakelocksName;
852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                long[] wlData = mProcWakelocksData;
853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Process.parseProcLine(wlBuffer, startIndex, endIndex, PROC_WAKELOCKS_FORMAT,
854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        nameStringArray, wlData, null);
855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                name = nameStringArray[0];
857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                count = (int) wlData[1];
858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // convert nanoseconds to microseconds with rounding.
859c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                totalTime = (wlData[2] + 500) / 1000;
860c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
861c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (name.length() > 0) {
862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (!m.containsKey(name)) {
863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        m.put(name, new KernelWakelockStats(count, totalTime,
864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                sKernelWakelockUpdateVersion));
865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        numUpdatedWlNames++;
866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    } else {
867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        KernelWakelockStats kwlStats = m.get(name);
868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        if (kwlStats.mVersion == sKernelWakelockUpdateVersion) {
869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount += count;
870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime += totalTime;
871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        } else {
872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount = count;
873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime = totalTime;
874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mVersion = sKernelWakelockUpdateVersion;
875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            numUpdatedWlNames++;
876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        }
877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                startIndex = endIndex;
880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (m.size() != numUpdatedWlNames) {
883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Don't report old data.
884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Iterator<KernelWakelockStats> itr = m.values().iterator();
885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                while (itr.hasNext()) {
886c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (itr.next().mVersion != sKernelWakelockUpdateVersion) {
887c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        itr.remove();
888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
889c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
890c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return m;
892c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
895c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private class KernelWakelockStats {
896c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mCount;
897c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long mTotalTime;
898c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mVersion;
899c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
900c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        KernelWakelockStats(int count, long totalTime, int version) {
901c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = count;
902c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = totalTime;
903c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mVersion = version;
904c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
905c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
906c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
907c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
908c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Get the KernelWakelockTimer associated with name, and create a new one if one
909c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * doesn't already exist.
910c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
911c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public SamplingTimer getKernelWakelockTimerLocked(String name) {
912c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer kwlt = mKernelWakelockStats.get(name);
913c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kwlt == null) {
914c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
915c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    true /* track reported values */);
916c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mKernelWakelockStats.put(name, kwlt);
917c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
918c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return kwlt;
919c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
9203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataPlug(long[] dataTransfer, long currentBytes) {
9223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        dataTransfer[STATS_LAST] = dataTransfer[STATS_UNPLUGGED];
9233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        dataTransfer[STATS_UNPLUGGED] = -1;
9243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private void doDataUnplug(long[] dataTransfer, long currentBytes) {
9273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        dataTransfer[STATS_UNPLUGGED] = currentBytes;
9283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9303f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
9313f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Radio uptime in microseconds when transferring data. This value is very approximate.
9323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @return
9333f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
9343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private long getCurrentRadioDataUptime() {
9353718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        try {
9363718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            File awakeTimeFile = new File("/sys/devices/virtual/net/rmnet0/awake_time_ms");
9373718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (!awakeTimeFile.exists()) return 0;
9383718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            BufferedReader br = new BufferedReader(new FileReader(awakeTimeFile));
9393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            String line = br.readLine();
9403718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            br.close();
9413f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return Long.parseLong(line) * 1000;
9423718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (NumberFormatException nfe) {
9433718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
9443718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } catch (IOException ioe) {
9453718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            // Nothing
9463718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
9473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return 0;
9483718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9493718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9503f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
9513f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * @deprecated use getRadioDataUptime
9523f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
9533718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getRadioDataUptimeMs() {
9543f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return getRadioDataUptime() / 1000;
9553f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
9563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
9573f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    /**
9583f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     * Returns the duration that the cell radio was up for data transfers.
9593f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani     */
9603f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public long getRadioDataUptime() {
9613718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (mRadioDataStart == -1) {
9623718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return mRadioDataUptime;
9633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
9643f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentRadioDataUptime() - mRadioDataStart;
9653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
9663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
9673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
9683f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    private int getCurrentBluetoothPingCount() {
9693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBtHeadset != null) {
9703f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBtHeadset.getBatteryUsageHint();
9713f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
9723f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return -1;
9733f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
9743f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
9753f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public int getBluetoothPingCount() {
9763f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        if (mBluetoothPingStart == -1) {
9773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return mBluetoothPingCount;
9783f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        } else if (mBtHeadset != null) {
9793f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani            return getCurrentBluetoothPingCount() - mBluetoothPingStart;
9803f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        }
9813f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        return -1;
9823f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
9833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
9843f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    public void setBtHeadset(BluetoothHeadset headset) {
9853f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBtHeadset = headset;
9863f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani    }
9873f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doUnplug(long batteryUptime, long batteryRealtime) {
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesReceived = NetStat.getUidRxBytes(u.mUid);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesSent = NetStat.getUidTxBytes(u.mUid);
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track total mobile data
10003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataUnplug(mMobileDataRx, NetStat.getMobileRxBytes());
10013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataUnplug(mMobileDataTx, NetStat.getMobileTxBytes());
10023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataUnplug(mTotalDataRx, NetStat.getTotalRxBytes());
10033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataUnplug(mTotalDataTx, NetStat.getTotalTxBytes());
10043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
10053f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataStart = getCurrentRadioDataUptime();
10063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = 0;
10073f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
10083f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = getCurrentBluetoothPingCount();
10093f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = 0;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doPlug(long batteryUptime, long batteryRealtime) {
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataPlug(mMobileDataRx, NetStat.getMobileRxBytes());
10283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataPlug(mMobileDataTx, NetStat.getMobileTxBytes());
10293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataPlug(mTotalDataRx, NetStat.getTotalRxBytes());
10303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        doDataPlug(mTotalDataTx, NetStat.getTotalTxBytes());
10313718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Track radio awake time
10323f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mRadioDataUptime = getRadioDataUptime();
10333718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
10343f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
10353f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        // Track bt headset ping count
10363f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = getBluetoothPingCount();
10373f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10393718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
10412e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStartGps();
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
10452e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteStopGps();
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10473718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
1052617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1053617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this);
1054617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
1062617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
1063617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1064617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1065617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1066617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1067617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1068617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightnessLocked(int brightness) {
1069617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Bin the brightness.
1070617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
1071617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (bin < 0) bin = 0;
1072617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
1073617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mScreenBrightnessBin != bin) {
1074617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenOn) {
1075617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (mScreenBrightnessBin >= 0) {
1076617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
1077617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1078617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[bin].startRunningLocked(this);
1079617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1080617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessBin = bin;
1081617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1082617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1083617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1084617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteInputEventLocked() {
1085617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.stepLocked();
1086617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1087617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1088617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivityLocked(int uid, int event) {
10892e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteUserActivityLocked(event);
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
110532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
110632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    public void noteAirplaneModeLocked(boolean isAirplaneMode) {
110732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        final int bin = mPhoneSignalStrengthBin;
110832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (bin >= 0) {
110932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            if (!isAirplaneMode) {
111032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                if (!mPhoneSignalStrengthsTimer[bin].isRunningLocked()) {
111132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                    mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
111232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                }
111332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            } else {
111432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                for (int i = 0; i < NUM_SIGNAL_STRENGTH_BINS; i++) {
111532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                    while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) {
111632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                        mPhoneSignalStrengthsTimer[i].stopRunningLocked(this);
111732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                    }
111832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani                }
111932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            }
112032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
112132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
112232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
1123e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
1124627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
1125627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin;
1126e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville
1127e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        if (!signalStrength.isGsm()) {
1128e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            int dBm = signalStrength.getCdmaDbm();
1129e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (dBm >= -75) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1130e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (dBm >= -85) bin = SIGNAL_STRENGTH_GREAT;
1131e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (dBm >= -95)  bin = SIGNAL_STRENGTH_GOOD;
1132e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (dBm >= -100)  bin = SIGNAL_STRENGTH_MODERATE;
1133e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else bin = SIGNAL_STRENGTH_POOR;
1134e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        } else {
1135e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            int asu = signalStrength.getGsmSignalStrength();
1136e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
1137e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT;
1138e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 8)  bin = SIGNAL_STRENGTH_GOOD;
1139e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else if (asu >= 4)  bin = SIGNAL_STRENGTH_MODERATE;
1140e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            else bin = SIGNAL_STRENGTH_POOR;
1141e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville        }
1142627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
1143627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
1144627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
1145627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1146627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthBin = bin;
1147627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
1148627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1149627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1150627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1151627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
1152627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
1153627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
1154627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
1155627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
1156627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
1157627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1158627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
1159627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
1160627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1161627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
1162627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
1163627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1164627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
1165627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
1166627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1167627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1168627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
11693718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData);
1170627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
1171627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
1172627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
1173627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1174627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
1175627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
1176627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1177627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1178627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1179617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOnLocked(int uid) {
1180105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
1181105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
1182105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
1183105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1184617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid != uid) {
1185617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mWifiOnUid >= 0) {
11862e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn                getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked();
1187617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1188617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = uid;
11892e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn            getUidStatsLocked(uid).noteWifiTurnedOnLocked();
1190617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1191105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1192105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1193617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOffLocked(int uid) {
1194105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
1195105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
1196105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
1197105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid >= 0) {
11992e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn            getUidStatsLocked(mWifiOnUid).noteWifiTurnedOffLocked();
1200617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = -1;
1201617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1202105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1203244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1204244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOnLocked(int uid) {
1205244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mAudioOn) {
1206244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = true;
1207244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.startRunningLocked(this);
1208244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
12092e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOnLocked();
1210244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1211105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1212244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteAudioOffLocked(int uid) {
1213244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mAudioOn) {
1214244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOn = false;
1215244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioOnTimer.stopRunningLocked(this);
1216244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
12172e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteAudioTurnedOffLocked();
1218244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1219244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1220244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOnLocked(int uid) {
1221244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (!mVideoOn) {
1222244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = true;
1223244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.startRunningLocked(this);
1224244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
12252e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOnLocked();
1226244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1227244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1228244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteVideoOffLocked(int uid) {
1229244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        if (mVideoOn) {
1230244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOn = false;
1231244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoOnTimer.stopRunningLocked(this);
1232244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
12332e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteVideoTurnedOffLocked();
1234244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
1235244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1236d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiRunningLocked() {
1237d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (!mWifiRunning) {
1238d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = true;
1239d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.startRunningLocked(this);
1240d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1241d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1242d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1243d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiStoppedLocked() {
1244d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (mWifiRunning) {
1245d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = false;
1246d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.stopRunningLocked(this);
1247d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1248d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1249d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
1251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
1252105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
1253105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
1254105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
1258105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
1259105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
1260105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
1261105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1264105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
12652e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked();
1266105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1267105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1268105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
12692e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteFullWifiLockReleasedLocked();
1270105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1271105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1272105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
12732e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockAcquiredLocked();
1274105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1275105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1276105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
12772e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteScanWifiLockReleasedLocked();
1278105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
12795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
12805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabledLocked(int uid) {
12812e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastEnabledLocked();
12825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
12835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
12845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabledLocked(int uid) {
12852e418428987132ea66533cbc05f9c526eb59519aDianne Hackborn        getUidStatsLocked(uid).noteWifiMulticastDisabledLocked();
12865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
12875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
1289c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which);
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1292617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public long getScreenBrightnessTime(int brightnessBin,
1293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which) {
1294c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
1295617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                batteryRealtime, which);
1296617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1297244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1298617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getInputEventCount(int which) {
1299c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mInputEventCounter.getCountLocked(which);
1300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
1303c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which);
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1305244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
1307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
1308c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
1309627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
1310627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1311627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1312617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneSignalStrengthCount(int dataType, int which) {
1313c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
1314617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1315617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1316627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
1317627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
1318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
1319627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
1320627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1321627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1322617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneDataConnectionCount(int dataType, int which) {
1323c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
1324617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1325617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1326105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
1327c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which);
1328105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1329105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1330d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    @Override public long getWifiRunningTime(long batteryRealtime, int which) {
1331c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
1332d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1333d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1334105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
1335c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which);
1336105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1337105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        boolean mWifiTurnedOn;
1365c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mWifiTurnedOnTimer;
1366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1367105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
1368c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mFullWifiLockTimer;
1369105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1370105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
1371c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mScanWifiLockTimer;
1372244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
13735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        boolean mWifiMulticastEnabled;
13745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        StopwatchTimer mWifiMulticastTimer;
1375244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1376244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mAudioTurnedOn;
1377244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mAudioTurnedOnTimer;
1378244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1379244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        boolean mVideoTurnedOn;
1380244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        StopwatchTimer mVideoTurnedOnTimer;
13815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
1382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter[] mUserActivityCounters;
1383617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
1406c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables);
1407c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables);
1408c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables);
14095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED,
14105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables);
1411244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables);
1412244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables);
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1434eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1435eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1439eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1440eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1459eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1460eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani        @Override
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1475105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1476617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteWifiTurnedOnLocked() {
1477617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (!mWifiTurnedOn) {
1478617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOn = true;
1479617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1480617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1481617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1482617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1483617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1484617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteWifiTurnedOffLocked() {
1485617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mWifiTurnedOn) {
1486617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOn = false;
1487617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1488617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1489617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1490617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1491617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1492105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
1493105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
1494105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
1495105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
1496105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1497105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1498105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1499105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1500244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteVideoTurnedOnLocked() {
1501244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (!mVideoTurnedOn) {
1502244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOn = true;
1503244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1504244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1505244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1506244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1507244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1508244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteVideoTurnedOffLocked() {
1509244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (mVideoTurnedOn) {
1510244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOn = false;
1511244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1512244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1513244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1514244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1515244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1516244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteAudioTurnedOnLocked() {
1517244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (!mAudioTurnedOn) {
1518244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOn = true;
1519244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1520244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1521244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1522244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1523244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1524244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public void noteAudioTurnedOffLocked() {
1525244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            if (mAudioTurnedOn) {
1526244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOn = false;
1527244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1528244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
1529244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1530244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1531244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
1533105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
1534105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
1535105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
1536105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1537105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1538105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1539105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
1541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
1542105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
1543105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
1544105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1546105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1548105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
1549105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
1550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
1551105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
1552105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1553105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
15545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
15555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
15565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastEnabledLocked() {
15575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (!mWifiMulticastEnabled) {
15585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = true;
15595347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this);
15605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
15615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
15625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
15635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
15645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public void noteWifiMulticastDisabledLocked() {
15655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            if (mWifiMulticastEnabled) {
15665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastEnabled = false;
15675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this);
15685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            }
15695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
15705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
1571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public long getWifiTurnedOnTime(long batteryRealtime, int which) {
1573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mWifiTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1574617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1575244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1576244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1577244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public long getAudioTurnedOnTime(long batteryRealtime, int which) {
1578244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1579244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1580244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1581244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        @Override
1582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        public long getVideoTurnedOnTime(long batteryRealtime, int which) {
1583244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1584244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
1585244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
1586105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1587105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
1588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
1589105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1590105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1591105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1592105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
1593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
1594105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
15955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
15965347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        @Override
15975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        public long getWifiMulticastTime(long batteryRealtime, int which) {
15985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime,
15995347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                                                          which);
16005347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
16015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
1602617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1603617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteUserActivityLocked(int type) {
1604617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1605617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                initUserActivityLocked();
1606617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1607617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (type < 0) type = 0;
1608617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1;
1609617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters[type].stepLocked();
1610617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1611617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1612617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1613617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
1614617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
1615617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1616617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1617617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1618617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
1619617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1620617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
1621617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
1623617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1624617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1625617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
1626617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
1627617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1628617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
1629617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1630617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1631617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1636244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
1672617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime);
1673105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
1674244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime);
1675244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime);
1676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
16775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastTimer.writeToParcel(out, batteryRealtime);
1678617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1679617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
1680617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
1681617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
1682617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1683617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
1684617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1685617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(wakelockName, wakelock);
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
1731617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiTurnedOn = false;
1732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables, in);
1733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
1734c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables, in);
1735244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOn = false;
1736244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables, in);
1737244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOn = false;
1738244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables, in);
1739105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
1740c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables, in);
17415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastEnabled = false;
17425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED,
17435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt                    null, mUnpluggables, in);
1744617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() == 0) {
1745617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = null;
1746617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
1747617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
1748617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1749617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
1750617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1751617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1761c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return new StopwatchTimer(type, pool, unpluggables, in);
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
1817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
1831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return new StopwatchTimer(0, pool, unpluggables, in);
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1849eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1850eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1876eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * Amount of time the process was running in the foreground.
1877eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
1878eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mForegroundTime;
1879eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1880eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1896eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from a previous save.
1897eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
1898eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLoadedForegroundTime;
1899eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1900eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
1916eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time loaded from the previous run
1917eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
1918eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mLastForegroundTime;
1919eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
1920eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1935eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            /**
1936eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             * The amount of foreground time since unplugged.
1937eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani             */
1938eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            long mUnpluggedForegroundTime;
1939eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
1948eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = mForegroundTime;
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
1955105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
1956105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
1957105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
1960eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mForegroundTime);
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
1964eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLoadedForegroundTime);
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastUserTime);
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastSystemTime);
1968eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mLastForegroundTime);
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastStarts);
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
1972eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                out.writeLong(mUnpluggedForegroundTime);
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
1979eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime = in.readLong();
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
1983eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLoadedForegroundTime = in.readLong();
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastUserTime = in.readLong();
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastSystemTime = in.readLong();
1987eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mLastForegroundTime = in.readLong();
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastStarts = in.readInt();
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
1991eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mUnpluggedForegroundTime = in.readLong();
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2004eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public void addForegroundTimeLocked(long ttime) {
2005eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                mForegroundTime += ttime;
2006eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
2007eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
2045eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            public long getForegroundTime(int which) {
2046eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                long val;
2047eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                if (which == STATS_LAST) {
2048eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mLastForegroundTime;
2049eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                } else {
2050eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    val = mForegroundTime;
2051eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    if (which == STATS_CURRENT) {
2052eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mLoadedForegroundTime;
2053eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    } else if (which == STATS_UNPLUGGED) {
2054eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                        val -= mUnpluggedForegroundTime;
2055eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                    }
2056eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                }
2057eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani                return val;
2058eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            }
2059eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani
2060eaeb663bcd7a82b654954b42663232cbd7bef7e7Amith Yamasani            @Override
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWakeups = in.readInt();
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastWakeups);
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
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 service.
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStartTime = in.readLong();
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStarts = in.readInt();
22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastLaunches = in.readInt();
22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLastStartTime);
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastStarts);
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastLaunches);
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2485c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wl = new Wakelock();
24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(name, wl);
24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_PARTIAL, mPartialTimers, mUnpluggables);
24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2503c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_FULL, mFullTimers, mUnpluggables);
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2510c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_WINDOW, mWindowTimers, mUnpluggables);
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2532c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
2534c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            t = new StopwatchTimer(BatteryStats.SENSOR, timers, mUnpluggables);
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartWakeLocked(String name, int type) {
2543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopWakeLocked(String name, int type) {
2550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
2557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
2565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
2572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
2579c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
2582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            }
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = new File(filename);
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBackupFile = new File(filename + ".bak");
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
2594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables);
2595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
2596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables);
2597617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2598617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
2599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables);
2600627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables);
2602627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2603627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables);
2605627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiOnTimer = new StopwatchTimer(-3, null, mUnpluggables);
2607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiRunningTimer = new StopwatchTimer(-4, null, mUnpluggables);
2608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mBluetoothOnTimer = new StopwatchTimer(-5, null, mUnpluggables);
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
2616633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
2617633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2634105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnBattery(boolean onBattery, int level) {
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
2636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            updateKernelWakelocksLocked();
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnBattery != onBattery) {
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOnBattery = mOnBatteryInternal = onBattery;
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long uptime = SystemClock.uptimeMillis() * 1000;
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mSecRealtime = SystemClock.elapsedRealtime();
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long realtime = mSecRealtime * 1000;
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (onBattery) {
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryUptimeStart = uptime;
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryRealtimeStart = realtime;
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
2648633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    mDischargeCurrentLevel = mDischargeStartLevel = level;
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doUnplug(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
2653633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    mDischargeCurrentLevel = level;
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doPlug(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mLastWriteTime + (60 * 1000)) < mSecRealtime) {
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mFile != null) {
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        writeLocked();
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2664633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
2665633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public void recordCurrentLevel(int level) {
2666633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = level;
2667633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
2668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
2670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
2671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2672d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        if (m == null) {
2673d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            // Not crashing might make board bringup easier.
2674d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            Log.w(TAG, "Couldn't get kernel wake lock stats");
2675d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen            return;
2676d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen        }
2677d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen
2678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
2679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
2680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
2681c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2682c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
2683c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
2684c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
2685c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
2686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
2687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
2688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
2689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
2690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
2691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
2692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
2694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
2695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
2696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
2697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
2698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
2699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
2700c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
2701c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
2702c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mUptime + (curTime-mUptimeStart);
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart);
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27933718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
27943718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    private long getTcpBytes(long current, long[] dataBytes, int which) {
27953718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        if (which == STATS_LAST) {
27963718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return dataBytes[STATS_LAST];
27973718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        } else {
27983718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            if (which == STATS_UNPLUGGED) {
27993718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                if (dataBytes[STATS_UNPLUGGED] < 0) {
28003718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return dataBytes[STATS_LAST];
28013718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                } else {
28023718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                    return current - dataBytes[STATS_UNPLUGGED];
28033718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                }
28043718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            } else if (which == STATS_TOTAL) {
28053718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani                return (current - dataBytes[STATS_CURRENT]) + dataBytes[STATS_TOTAL];
28063718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            }
28073718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani            return current - dataBytes[STATS_CURRENT];
28083718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        }
28093718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
28103718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
28113718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
28123718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesSent(int which) {
28133718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return getTcpBytes(NetStat.getMobileTxBytes(), mMobileDataTx, which);
28143718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
28153718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
28163718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
28173718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getMobileTcpBytesReceived(int which) {
28183718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return getTcpBytes(NetStat.getMobileRxBytes(), mMobileDataRx, which);
28193718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
28203718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
28213718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
28223718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesSent(int which) {
28233718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return getTcpBytes(NetStat.getTotalTxBytes(), mTotalDataTx, which);
28243718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
28253718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
28263718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    /** Only STATS_UNPLUGGED works properly */
28273718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    public long getTotalTcpBytesReceived(int which) {
28283718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        return getTcpBytes(NetStat.getTotalRxBytes(), mTotalDataRx, which);
28293718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani    }
28303718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
2831105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
2832633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
2833105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
2834633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
2835105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2836105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2837105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2838633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
2839633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return mDischargeStartLevel;
2840105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2841105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2842105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
2843633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
2844105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
2845633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
2846105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2847105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2848105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2849633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
2850633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return mDischargeCurrentLevel;
2851105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
287132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
288232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * Retrieve the statistics object for a particular process, given
288332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * the name of the process.
288432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @param name process name
288532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     * @return the statistics object for the process
288632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani     */
2887819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani    public Uid.Proc getProcessStatsLocked(String name, int pid) {
288832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        int uid;
288932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        if (mUidCache.containsKey(name)) {
289032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            uid = mUidCache.get(name);
289132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        } else {
2892819f928f6a9dc3fdf408236f33e17f03a7dfed2cAmith Yamasani            uid = Process.getUidForPid(pid);
289332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani            mUidCache.put(name, uid);
289432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
289532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        Uid u = getUidStatsLocked(uid);
289632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        return u.getProcessStatsLocked(name);
289732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
289832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
289932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    /**
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeLocked() {
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "writeLocked: no file associated with this instance");
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Keep the old file around until we know the new one has
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been successfully written.
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFile.exists()) {
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mBackupFile.exists()) {
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBackupFile.delete();
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFile.renameTo(mBackupFile);
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream stream = new FileOutputStream(mFile);
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel out = Parcel.obtain();
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            writeSummaryToParcel(out);
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.write(out.marshall());
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.recycle();
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBackupFile.delete();
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastWriteTime = SystemClock.elapsedRealtime();
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e("BatteryStats", "Error writing battery statistics", e);
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readLocked: no file associated with this instance");
29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileInputStream stream = null;
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBackupFile.exists()) {
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mBackupFile);
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (java.io.IOException e) {
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We'll try for the normal settings file.
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (stream == null) {
29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mFile.exists()) {
29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mFile);
29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e("BatteryStats", "Error reading battery statistics", e);
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readFromParcel: version got " + version
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
3030633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = in.readInt();
3031633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
3032105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
3037617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3038617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
3039617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3040617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
3043627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3044627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
3045627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3046627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3047627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
3048627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3049105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
3050105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
3051d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
3052d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.readSummaryFromParcelLocked(in);
3053105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
3054105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3056c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
3057c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
3058c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
3059c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
3060c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
3061c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3062c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3063c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3070617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOn = false;
3071617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in);
3072105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
3073105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
3074244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mAudioTurnedOn = false;
3075244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in);
3076244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mVideoTurnedOn = false;
3077244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in);
3078105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
3079105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
30805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastEnabled = false;
30815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
30825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
3083617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
3084617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
3085617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
3086617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
3087617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
3088617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
3089617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
3090617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
3091617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastUserTime = in.readLong();
31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastSystemTime = in.readLong();
31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastStarts = in.readInt();
31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastWakeups = in.readInt();
31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStartTime = in.readLong();
31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStarts = in.readInt();
31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastLaunches = in.readInt();
31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL));
31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT));
31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL));
31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT));
31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL));
31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT));
31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL));
31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT));
3174633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeStartLevel);
3175633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
3176105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3179617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3180617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
3181617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3182617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3184627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3185627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
3186627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3187627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3188627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
3189627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3190105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3191d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3192105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
3195c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
3196c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
3197c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
3198c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
3199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
3200c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
3201c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
3202c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
3203c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3204c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3205c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
3211105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
3212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3213105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3214c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani            u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3215c33fe6c9a71008d51aab7775532d73a3eaf12370Amith Yamasani            u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
3216105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
32175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL);
32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3219617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
3220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
3221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
3222617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
3223617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
3224617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
3225617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
3226617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
3227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime - ps.mLoadedUserTime);
32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime);
32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts - ps.mLoadedStarts);
32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups - ps.mLoadedWakeups);
32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time - ss.mLoadedStartTime);
33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
33089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts - ss.mLoadedStarts);
33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches - ss.mLoadedLaunches);
33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
33139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
33159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesReceived(STATS_TOTAL));
33179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesSent(STATS_TOTAL));
33189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
33249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
3337c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables, in);
3338617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3339c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables, in);
3340617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
33429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
3343c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
3344627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3345c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables, in);
3346627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3347627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3348c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables, in);
3349627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3350105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
3351c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
3352d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
3353c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiRunningTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
3354105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
3355c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mBluetoothOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
33589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
3370633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = in.readInt();
3371633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
33743718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_LAST] = in.readLong();
33753718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataRx[STATS_UNPLUGGED] = -1;
33763718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_LAST] = in.readLong();
33773718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mMobileDataTx[STATS_UNPLUGGED] = -1;
33783718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_LAST] = in.readLong();
33793718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataRx[STATS_UNPLUGGED] = -1;
33803718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_LAST] = in.readLong();
33813718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mTotalDataTx[STATS_UNPLUGGED] = -1;
33823718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
33833718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataUptime = in.readLong();
33843718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        mRadioDataStart = -1;
33853718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
33863f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingCount = in.readInt();
33873f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        mBluetoothPingStart = -1;
33883f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
3389c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
3390c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
3391c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
3392c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
3393c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
3394244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani                in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel
3395c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
3396c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
3397c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3398c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3399c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeToParcelLocked(out, flags);
34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writeToParcelLocked(Parcel out, int flags) {
34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
34229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
34249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
34269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
34289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastUptime);
34299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
34309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastRealtime);
34319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
3432617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
3434617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3435617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
3437627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3438627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
3439627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3440627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3441627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
3442627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
3444d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeToParcel(out, batteryRealtime);
3445105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastUptime);
34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastRealtime);
34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
34579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
3459633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeStartLevel);
3460633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34633718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getMobileTcpBytesReceived(STATS_UNPLUGGED));
34643718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getMobileTcpBytesSent(STATS_UNPLUGGED));
34653718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getTotalTcpBytesReceived(STATS_UNPLUGGED));
34663718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        out.writeLong(getTotalTcpBytesSent(STATS_UNPLUGGED));
34673718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
34683718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani        // Write radio uptime for data
34693f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeLong(getRadioDataUptime());
34703f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
34713f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani        out.writeInt(getBluetoothPingCount());
34723718aaabe6259dcf86a3666ff92d16e4be5da555Amith Yamasani
3473c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
3474c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
3475c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = ent.getValue();
3476c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
3477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
3478c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
3479c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
3480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
3481c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
3482c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3483c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int size = mUidStats.size();
34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(size);
34879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < size; i++) {
34889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(i));
34899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid uid = mUidStats.valueAt(i);
34909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uid.writeToParcelLocked(out, batteryRealtime);
34929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
34939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
34959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
34969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
34979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
34989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
34999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
35029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
35039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
35059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
35061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
35079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
35081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
35091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
35101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
3511617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
35121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
35131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
3514617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
35151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
35161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
35171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
35181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
3519627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
35201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
35211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
3522627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
3523627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
35241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
35251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
35261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
35271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
35281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
35291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
35301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiRunningTimer.logState(pr, "  ");
35311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
35321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
35339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
35349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
35359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
35369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3537