BatteryStatsImpl.java revision 627bba736d022c39696b7c582a6af5592d2b8c33
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
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.BatteryStats;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.NetStat;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ParcelFormatException;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcelable;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
25627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
51627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    private static final int VERSION = 29;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mFile;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mBackupFile;
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Timer> mPartialTimers = new ArrayList<Timer>();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Timer> mFullTimers = new ArrayList<Timer>();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Timer> mWindowTimers = new ArrayList<Timer>();
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<ArrayList<Timer>> mSensorTimers
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new SparseArray<ArrayList<Timer>>();
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Timer mScreenOnTimer;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Timer mPhoneOnTimer;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
96627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
97627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    final Timer[] mPhoneSignalStrengthsTimer = new Timer[NUM_SIGNAL_STRENGTH_BINS];
98627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
99627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
100627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    final Timer[] mPhoneDataConnectionsTimer = new Timer[NUM_DATA_CONNECTION_TYPES];
101627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
102105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
103105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    Timer mWifiOnTimer;
104d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
105d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    boolean mWifiRunning;
106d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    Timer mWifiRunningTimer;
107105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
109105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    Timer mBluetoothOnTimer;
110105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
125105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
126105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
127105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
128105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    int mUnpluggedStartLevel;
129105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    int mPluggedStartLevel;
130105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class Timer extends BatteryStats.Timer implements Unpluggable {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ArrayList<Timer> mTimerPool;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mNesting;
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The last time at which we updated the timer.  If mNesting is > 0,
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * subtract this from the current battery time to find the amount of
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * time we have been running since we last computed an update.
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUpdateTime;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time at which the timer was acquired, to determine if
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * was actually held for an interesting duration.
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mAcquireTime;
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Timer(int type, ArrayList<Timer> timerPool,
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ArrayList<Unpluggable> unpluggables, Parcel in) {
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTimerPool = timerPool;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastCount = in.readInt();
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTime = in.readLong();
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUpdateTime = in.readLong();
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Timer(int type, ArrayList<Timer> timerPool,
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ArrayList<Unpluggable> unpluggables) {
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTimerPool = timerPool;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLastCount);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLastTime);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUpdateTime);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting > 0) {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " old mTotalTime=" + mTotalTime
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " old mUpdateTime=" + mUpdateTime);
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTotalTime = computeRunTimeLocked(batteryRealtime);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = batteryRealtime;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "plug #" + mType
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ": new mTotalTime=" + mTotalTime
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " old mUpdateTime=" + mUpdateTime);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTotalTime(long batteryRealtime, int which) {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getCount(int which) {
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mCount;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
317627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
318627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mNesting=" + mNesting + " mCount=" + mCount
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
321627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
323627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
325627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mUpdateTime=" + mUpdateTime
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long realtime = SystemClock.elapsedRealtime() * 1000;
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<Timer> pool) {
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long realtime = SystemClock.elapsedRealtime() * 1000;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final Timer t = pool.get(i);
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private long computeRunTimeLocked(long curBatteryRealtime) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long runTime = computeRunTimeLocked(batteryRealtime);
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Divide by 1000 for backwards compatibility
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong((runTime + 500) / 1000);
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(((runTime - mLoadedTime) + 500) / 1000);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount - mLoadedCount);
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Multiply by 1000 for backwards compatibility
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = mLoadedTime = in.readLong() * 1000;
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTime = in.readLong() * 1000;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = mTotalTime;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = mLoadedCount = in.readInt();
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastCount = in.readInt();
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doUnplug(long batteryUptime, long batteryRealtime) {
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesReceived = NetStat.getUidRxBytes(u.mUid);
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesSent = NetStat.getUidTxBytes(u.mUid);
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doPlug(long batteryUptime, long batteryRealtime) {
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.get(uid).noteStartGps();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.get(uid).noteStopGps();
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
496627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneSignalStrengthLocked(int asu) {
497627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
498627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin;
499627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
500627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT;
501627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        else if (asu >= 8)  bin = SIGNAL_STRENGTH_GOOD;
502627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        else if (asu >= 4)  bin = SIGNAL_STRENGTH_MODERATE;
503627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        else bin = SIGNAL_STRENGTH_POOR;
504627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
505627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
506627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
507627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
508627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthBin = bin;
509627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
510627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
511627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
512627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
513627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
514627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
515627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
516627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
517627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
518627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
519627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
520627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
521627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
522627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
523627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
524627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
525627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
526627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
527627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
528627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
529627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
530627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
531627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
532627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
533627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
534627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
535627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
536627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
537627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
538627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
539627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteWifiOnLocked() {
541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
542105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
543105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
544105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
545105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
546105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
547105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteWifiOffLocked() {
548105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
549105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
551105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
552105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
553105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
554d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiRunningLocked() {
555d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (!mWifiRunning) {
556d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = true;
557d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.startRunningLocked(this);
558d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
559d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
560d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
561d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiStoppedLocked() {
562d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (mWifiRunning) {
563d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = false;
564d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.stopRunningLocked(this);
565d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
566d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
567d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
568105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
569105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
570105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
571105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
572105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
573105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
574105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
575105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
576105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
577105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
578105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
579105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
580105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
581105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
582105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
583105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
584105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
585105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteFullWifiLockAcquiredLocked();
586105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
587105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
588105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
589105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
590105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
591105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
592105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteFullWifiLockReleasedLocked();
593105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
594105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
595105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
596105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
597105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
598105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
599105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteScanWifiLockAcquiredLocked();
600105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
601105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
602105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
603105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
604105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
605105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteScanWifiLockReleasedLocked();
607105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
608105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
609105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mScreenOnTimer.getTotalTime(batteryRealtime, which);
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPhoneOnTimer.getTotalTime(batteryRealtime, which);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
619627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
620627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTime(
621627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
622627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
623627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
624627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
625627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
626627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        return mPhoneDataConnectionsTimer[dataType].getTotalTime(
627627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
628627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
629627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
630105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
631105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return mWifiOnTimer.getTotalTime(batteryRealtime, which);
632105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
634d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    @Override public long getWifiRunningTime(long batteryRealtime, int which) {
635d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        return mWifiRunningTimer.getTotalTime(batteryRealtime, which);
636d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
637d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
638105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return mBluetoothOnTimer.getTotalTime(batteryRealtime, which);
640105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
641105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
668105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
669105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Timer mFullWifiLockTimer;
670105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
671105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
672105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Timer mScanWifiLockTimer;
673105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
696105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer = new Timer(FULL_WIFI_LOCK, null, mUnpluggables);
697105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer = new Timer(SCAN_WIFI_LOCK, null, mUnpluggables);
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
757105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
758105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
759105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
760105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
761105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
762105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
764105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
765105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
766105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
767105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
768105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
769105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
770105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
771105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
772105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
773105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
774105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
775105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
776105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
777105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
778105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
779105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
780105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
781105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
782105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
783105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
784105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
785105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
786105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
787105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
788105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
789105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return mFullWifiLockTimer.getTotalTime(batteryRealtime, which);
791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
793105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
794105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return mScanWifiLockTimer.getTotalTime(batteryRealtime, which);
796105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
797105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
838105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(wakelockName, wakelock);
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
885105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
886105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer = new Timer(FULL_WIFI_LOCK, null, mUnpluggables, in);
887105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
888105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer = new Timer(SCAN_WIFI_LOCK, null, mUnpluggables, in);
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer mTimerPartial;
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer mTimerFull;
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer mTimerWindow;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private Timer readTimerFromParcel(int type, ArrayList<Timer> pool,
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Timer(type, pool, unpluggables, in);
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer mTimer;
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private Timer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ArrayList<Timer> pool = mSensorTimers.get(mHandle);
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pool = new ArrayList<Timer>();
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Timer(0, pool, unpluggables, in);
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
1070105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
1071105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
1072105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastUserTime);
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastSystemTime);
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastStarts);
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastUserTime = in.readLong();
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastSystemTime = in.readLong();
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastStarts = in.readInt();
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWakeups = in.readInt();
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastWakeups);
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStartTime = in.readLong();
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStarts = in.readInt();
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastLaunches = in.readInt();
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLastStartTime);
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastStarts);
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastLaunches);
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Timer getWakeTimerLocked(String name, int type) {
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wl = new Wakelock();
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(name, wl);
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = null;
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        t = new Timer(WAKE_TYPE_PARTIAL, mPartialTimers, mUnpluggables);
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        t = new Timer(WAKE_TYPE_FULL, mFullTimers, mUnpluggables);
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        t = new Timer(WAKE_TYPE_WINDOW, mWindowTimers, mUnpluggables);
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Timer getSensorTimerLocked(int sensor, boolean create) {
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = se.mTimer;
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<Timer> timers = mSensorTimers.get(sensor);
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                timers = new ArrayList<Timer>();
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            t = new Timer(BatteryStats.SENSOR, timers, mUnpluggables);
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartWakeLocked(String name, int type) {
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getWakeTimerLocked(name, type);
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopWakeLocked(String name, int type) {
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getWakeTimerLocked(name, type);
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getSensorTimerLocked(sensor, true);
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getSensorTimerLocked(sensor, false);
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getSensorTimerLocked(Sensor.GPS, true);
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getSensorTimerLocked(Sensor.GPS, false);
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = new File(filename);
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBackupFile = new File(filename + ".bak");
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer = new Timer(-1, null, mUnpluggables);
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer = new Timer(-2, null, mUnpluggables);
1683627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
1684627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i] = new Timer(-100-i, null, mUnpluggables);
1685627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1686627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
1687627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i] = new Timer(-200-i, null, mUnpluggables);
1688627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1689105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer = new Timer(-3, null, mUnpluggables);
1690d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer = new Timer(-4, null, mUnpluggables);
1691d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mBluetoothOnTimer = new Timer(-5, null, mUnpluggables);
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
1699105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mUnpluggedStartLevel = 0;
1700105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mPluggedStartLevel = 0;
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1717105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnBattery(boolean onBattery, int level) {
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnBattery != onBattery) {
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOnBattery = mOnBatteryInternal = onBattery;
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long uptime = SystemClock.uptimeMillis() * 1000;
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mSecRealtime = SystemClock.elapsedRealtime();
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long realtime = mSecRealtime * 1000;
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (onBattery) {
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryUptimeStart = uptime;
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryRealtimeStart = realtime;
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
1730105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mUnpluggedStartLevel = level;
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doUnplug(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
1735105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mPluggedStartLevel = level;
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doPlug(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mLastWriteTime + (60 * 1000)) < mSecRealtime) {
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mFile != null) {
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        writeLocked();
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mUptime + (curTime-mUptimeStart);
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart);
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1836105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1837105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
1838105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public int getUnpluggedStartLevel() {
1839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
1840105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return getUnluggedStartLevelLocked();
1841105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1842105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1843105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1844105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public int getUnluggedStartLevelLocked() {
1845105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return mUnpluggedStartLevel;
1846105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1847105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1848105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
1849105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public int getPluggedStartLevel() {
1850105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
1851105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return getPluggedStartLevelLocked();
1852105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1853105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1854105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1855105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public int getPluggedStartLevelLocked() {
1856105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return mPluggedStartLevel;
1857105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeLocked() {
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "writeLocked: no file associated with this instance");
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Keep the old file around until we know the new one has
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been successfully written.
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFile.exists()) {
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mBackupFile.exists()) {
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBackupFile.delete();
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFile.renameTo(mBackupFile);
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream stream = new FileOutputStream(mFile);
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel out = Parcel.obtain();
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            writeSummaryToParcel(out);
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.write(out.marshall());
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.recycle();
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBackupFile.delete();
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastWriteTime = SystemClock.elapsedRealtime();
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e("BatteryStats", "Error writing battery statistics", e);
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readLocked: no file associated with this instance");
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileInputStream stream = null;
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBackupFile.exists()) {
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mBackupFile);
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (java.io.IOException e) {
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We'll try for the normal settings file.
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (stream == null) {
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mFile.exists()) {
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mFile);
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e("BatteryStats", "Error reading battery statistics", e);
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readFromParcel: version got " + version
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
2018105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mUnpluggedStartLevel = in.readInt();
2019105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mPluggedStartLevel = in.readInt();
2020105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
2027627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2028627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
2029627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2030627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2031627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
2032627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2033105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
2034105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
2035d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
2036d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.readSummaryFromParcelLocked(in);
2037105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
2038105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2046105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
2047105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
2048105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
2049105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
2050105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastUserTime = in.readLong();
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastSystemTime = in.readLong();
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastStarts = in.readInt();
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastWakeups = in.readInt();
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStartTime = in.readLong();
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStarts = in.readInt();
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastLaunches = in.readInt();
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL));
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT));
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL));
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT));
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL));
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT));
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL));
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT));
2133105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        out.writeInt(mUnpluggedStartLevel);
2134105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        out.writeInt(mPluggedStartLevel);
2135105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2139627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2140627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
2141627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2142627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2143627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
2144627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2145105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2146d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2147105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
2154105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2155105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2156105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime - ps.mLoadedUserTime);
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime);
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts - ps.mLoadedStarts);
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups - ps.mLoadedWakeups);
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time - ss.mLoadedStartTime);
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts - ss.mLoadedStarts);
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches - ss.mLoadedLaunches);
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesReceived(STATS_TOTAL));
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesSent(STATS_TOTAL));
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer = new Timer(-1, null, mUnpluggables, in);
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer = new Timer(-2, null, mUnpluggables, in);
2270627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2271627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i] = new Timer(-100-i, null, mUnpluggables, in);
2272627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2273627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2274627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i] = new Timer(-200-i, null, mUnpluggables, in);
2275627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2276105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
2277105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer = new Timer(-2, null, mUnpluggables, in);
2278d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
2279d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer = new Timer(-2, null, mUnpluggables, in);
2280105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
2281105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer = new Timer(-2, null, mUnpluggables, in);
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
2296105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mUnpluggedStartLevel = in.readInt();
2297105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mPluggedStartLevel = in.readInt();
22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeToParcelLocked(out, flags);
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writeToParcelLocked(Parcel out, int flags) {
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastUptime);
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastRealtime);
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
2333627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2334627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
2335627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2336627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2337627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
2338627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2339105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
2340d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeToParcel(out, batteryRealtime);
2341105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastUptime);
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastRealtime);
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
2355105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        out.writeInt(mUnpluggedStartLevel);
2356105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        out.writeInt(mPluggedStartLevel);
23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int size = mUidStats.size();
23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(size);
23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < size; i++) {
23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(i));
23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid uid = mUidStats.valueAt(i);
23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uid.writeToParcelLocked(out, batteryRealtime);
23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpLocked(Printer pw) {
23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
2382627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println("*** Screen timer:");
2383627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mScreenOnTimer.logState(pw, "  ");
2384627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println("*** Phone timer:");
2385627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneOnTimer.logState(pw, "  ");
2386627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2387627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                pw.println("*** Signal strength #" + i + ":");
2388627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pw, "  ");
2389627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
2390627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2391627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                pw.println("*** Data connection type #" + i + ":");
2392627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pw, "  ");
2393627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
2394627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println("*** Wifi timer:");
2395627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mWifiOnTimer.logState(pw, "  ");
2396627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println("*** WifiRunning timer:");
2397627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mWifiRunningTimer.logState(pw, "  ");
2398627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println("*** Bluetooth timer:");
2399627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mBluetoothOnTimer.logState(pw, "  ");
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2404