BatteryStatsImpl.java revision 105925376f8d0f6b318c9938c7b83ef7fef094da
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;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
50105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    private static final int VERSION = 27;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mFile;
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mBackupFile;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Timer> mPartialTimers = new ArrayList<Timer>();
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Timer> mFullTimers = new ArrayList<Timer>();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Timer> mWindowTimers = new ArrayList<Timer>();
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<ArrayList<Timer>> mSensorTimers
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            = new SparseArray<ArrayList<Timer>>();
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Timer mScreenOnTimer;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Timer mPhoneOnTimer;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
95105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
96105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    Timer mWifiOnTimer;
97105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
98105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
99105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    Timer mBluetoothOnTimer;
100105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
116105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
117105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
118105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    int mUnpluggedStartLevel;
119105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    int mPluggedStartLevel;
120105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final class Timer extends BatteryStats.Timer implements Unpluggable {
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final ArrayList<Timer> mTimerPool;
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mNesting;
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The last time at which we updated the timer.  If mNesting is > 0,
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * subtract this from the current battery time to find the amount of
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * time we have been running since we last computed an update.
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUpdateTime;
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time at which the timer was acquired, to determine if
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * was actually held for an interesting duration.
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mAcquireTime;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Timer(int type, ArrayList<Timer> timerPool,
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ArrayList<Unpluggable> unpluggables, Parcel in) {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTimerPool = timerPool;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastCount = in.readInt();
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTime = in.readLong();
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUpdateTime = in.readLong();
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Timer(int type, ArrayList<Timer> timerPool,
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ArrayList<Unpluggable> unpluggables) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTimerPool = timerPool;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLastCount);
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLastTime);
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUpdateTime);
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting > 0) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " old mTotalTime=" + mTotalTime
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " old mUpdateTime=" + mUpdateTime);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTotalTime = computeRunTimeLocked(batteryRealtime);
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = batteryRealtime;
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "plug #" + mType
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + ": new mTotalTime=" + mTotalTime
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " old mUpdateTime=" + mUpdateTime);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTotalTime(long batteryRealtime, int which) {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getCount(int which) {
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mCount;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void logState() {
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "mNesting=" + mNesting + " mCount=" + mCount
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "mTotalTime=" + mTotalTime
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "mLastTime=" + mLastTime
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i("foo", "mUpdateTime=" + mUpdateTime
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long realtime = SystemClock.elapsedRealtime() * 1000;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final ArrayList<Timer> pool) {
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long realtime = SystemClock.elapsedRealtime() * 1000;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final Timer t = pool.get(i);
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private long computeRunTimeLocked(long curBatteryRealtime) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long runTime = computeRunTimeLocked(batteryRealtime);
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Divide by 1000 for backwards compatibility
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong((runTime + 500) / 1000);
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(((runTime - mLoadedTime) + 500) / 1000);
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount - mLoadedCount);
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Multiply by 1000 for backwards compatibility
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = mLoadedTime = in.readLong() * 1000;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTime = in.readLong() * 1000;
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = mTotalTime;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = mLoadedCount = in.readInt();
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastCount = in.readInt();
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doUnplug(long batteryUptime, long batteryRealtime) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesReceived = NetStat.getUidRxBytes(u.mUid);
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesSent = NetStat.getUidTxBytes(u.mUid);
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doPlug(long batteryUptime, long batteryRealtime) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.get(uid).noteStartGps();
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.get(uid).noteStopGps();
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
486105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteWifiOnLocked() {
487105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
488105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
489105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
490105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
491105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
492105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
493105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteWifiOffLocked() {
494105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
495105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
496105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
497105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
498105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
499105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
500105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
501105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
502105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
503105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
504105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
505105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
506105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
507105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
508105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
509105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
510105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
511105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
512105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
513105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
514105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
515105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
516105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
517105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteFullWifiLockAcquiredLocked();
518105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
519105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
520105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
521105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
522105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
523105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
524105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteFullWifiLockReleasedLocked();
525105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
526105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
527105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
528105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
529105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
530105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
531105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteScanWifiLockAcquiredLocked();
532105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
533105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
534105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
535105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
536105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
537105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
538105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteScanWifiLockReleasedLocked();
539105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
540105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mScreenOnTimer.getTotalTime(batteryRealtime, which);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mPhoneOnTimer.getTotalTime(batteryRealtime, which);
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
550105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
551105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return mWifiOnTimer.getTotalTime(batteryRealtime, which);
552105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
553105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
554105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
555105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        return mBluetoothOnTimer.getTotalTime(batteryRealtime, which);
556105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
557105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
584105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
585105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Timer mFullWifiLockTimer;
586105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
587105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
588105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Timer mScanWifiLockTimer;
589105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
612105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer = new Timer(FULL_WIFI_LOCK, null, mUnpluggables);
613105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer = new Timer(SCAN_WIFI_LOCK, null, mUnpluggables);
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
673105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
674105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
675105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
677105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
678105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
679105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
680105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
681105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
682105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
683105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
684105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
685105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
686105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
687105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
688105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
689105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
690105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
691105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
692105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
693105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
694105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
695105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
696105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
697105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
698105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
699105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
700105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
701105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
702105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
703105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
704105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
705105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
706105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return mFullWifiLockTimer.getTotalTime(batteryRealtime, which);
707105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
708105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
709105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
710105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
711105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return mScanWifiLockTimer.getTotalTime(batteryRealtime, which);
712105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
713105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
754105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
755105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(wakelockName, wakelock);
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
801105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
802105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer = new Timer(FULL_WIFI_LOCK, null, mUnpluggables, in);
803105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
804105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer = new Timer(SCAN_WIFI_LOCK, null, mUnpluggables, in);
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer mTimerPartial;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer mTimerFull;
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer mTimerWindow;
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private Timer readTimerFromParcel(int type, ArrayList<Timer> pool,
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Timer(type, pool, unpluggables, in);
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                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer mTimer;
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            private Timer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ArrayList<Timer> pool = mSensorTimers.get(mHandle);
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    pool = new ArrayList<Timer>();
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Timer(0, pool, unpluggables, in);
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
986105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
987105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
988105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastUserTime);
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastSystemTime);
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastStarts);
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastUserTime = in.readLong();
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastSystemTime = in.readLong();
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastStarts = in.readInt();
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWakeups = in.readInt();
11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastWakeups);
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStartTime = in.readLong();
12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStarts = in.readInt();
12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastLaunches = in.readInt();
13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLastStartTime);
13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastStarts);
13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastLaunches);
13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Timer getWakeTimerLocked(String name, int type) {
14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wl = new Wakelock();
14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(name, wl);
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = null;
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        t = new Timer(WAKE_TYPE_PARTIAL, mPartialTimers, mUnpluggables);
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        t = new Timer(WAKE_TYPE_FULL, mFullTimers, mUnpluggables);
15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        t = new Timer(WAKE_TYPE_WINDOW, mWindowTimers, mUnpluggables);
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Timer getSensorTimerLocked(int sensor, boolean create) {
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = se.mTimer;
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            ArrayList<Timer> timers = mSensorTimers.get(sensor);
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                timers = new ArrayList<Timer>();
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            t = new Timer(BatteryStats.SENSOR, timers, mUnpluggables);
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartWakeLocked(String name, int type) {
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getWakeTimerLocked(name, type);
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopWakeLocked(String name, int type) {
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getWakeTimerLocked(name, type);
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getSensorTimerLocked(sensor, true);
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getSensorTimerLocked(sensor, false);
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getSensorTimerLocked(Sensor.GPS, true);
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Timer t = getSensorTimerLocked(Sensor.GPS, false);
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = new File(filename);
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBackupFile = new File(filename + ".bak");
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer = new Timer(-1, null, mUnpluggables);
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer = new Timer(-2, null, mUnpluggables);
1599105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer = new Timer(-3, null, mUnpluggables);
1600105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer = new Timer(-4, null, mUnpluggables);
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
1608105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mUnpluggedStartLevel = 0;
1609105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mPluggedStartLevel = 0;
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1626105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnBattery(boolean onBattery, int level) {
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnBattery != onBattery) {
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOnBattery = mOnBatteryInternal = onBattery;
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long uptime = SystemClock.uptimeMillis() * 1000;
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mSecRealtime = SystemClock.elapsedRealtime();
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long realtime = mSecRealtime * 1000;
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (onBattery) {
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryUptimeStart = uptime;
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryRealtimeStart = realtime;
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
1639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mUnpluggedStartLevel = level;
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doUnplug(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
1644105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                    mPluggedStartLevel = level;
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doPlug(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mLastWriteTime + (60 * 1000)) < mSecRealtime) {
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mFile != null) {
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        writeLocked();
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mUptime + (curTime-mUptimeStart);
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart);
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1745105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1746105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
1747105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public int getUnpluggedStartLevel() {
1748105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
1749105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return getUnluggedStartLevelLocked();
1750105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1751105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1752105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1753105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public int getUnluggedStartLevelLocked() {
1754105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return mUnpluggedStartLevel;
1755105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1756105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1757105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
1758105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public int getPluggedStartLevel() {
1759105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
1760105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return getPluggedStartLevelLocked();
1761105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1762105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1764105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public int getPluggedStartLevelLocked() {
1765105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            return mPluggedStartLevel;
1766105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeLocked() {
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "writeLocked: no file associated with this instance");
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Keep the old file around until we know the new one has
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been successfully written.
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFile.exists()) {
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mBackupFile.exists()) {
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBackupFile.delete();
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFile.renameTo(mBackupFile);
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream stream = new FileOutputStream(mFile);
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel out = Parcel.obtain();
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            writeSummaryToParcel(out);
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.write(out.marshall());
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.recycle();
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBackupFile.delete();
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastWriteTime = SystemClock.elapsedRealtime();
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e("BatteryStats", "Error writing battery statistics", e);
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readLocked: no file associated with this instance");
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileInputStream stream = null;
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBackupFile.exists()) {
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mBackupFile);
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (java.io.IOException e) {
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We'll try for the normal settings file.
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (stream == null) {
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mFile.exists()) {
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mFile);
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e("BatteryStats", "Error reading battery statistics", e);
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readFromParcel: version got " + version
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
1927105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mUnpluggedStartLevel = in.readInt();
1928105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mPluggedStartLevel = in.readInt();
1929105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
1936105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
1937105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
1938105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
1939105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1947105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
1948105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
1949105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
1950105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
1951105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastUserTime = in.readLong();
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastSystemTime = in.readLong();
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastStarts = in.readInt();
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastWakeups = in.readInt();
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStartTime = in.readLong();
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStarts = in.readInt();
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastLaunches = in.readInt();
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL));
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT));
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL));
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT));
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL));
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT));
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL));
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT));
2034105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        out.writeInt(mUnpluggedStartLevel);
2035105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        out.writeInt(mPluggedStartLevel);
2036105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2040105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2041105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
2048105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2049105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2050105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime - ps.mLoadedUserTime);
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime);
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts - ps.mLoadedStarts);
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups - ps.mLoadedWakeups);
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time - ss.mLoadedStartTime);
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts - ss.mLoadedStarts);
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches - ss.mLoadedLaunches);
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesReceived(STATS_TOTAL));
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesSent(STATS_TOTAL));
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer = new Timer(-1, null, mUnpluggables, in);
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer = new Timer(-2, null, mUnpluggables, in);
2164105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
2165105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer = new Timer(-2, null, mUnpluggables, in);
2166105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
2167105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer = new Timer(-2, null, mUnpluggables, in);
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
2182105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mUnpluggedStartLevel = in.readInt();
2183105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mPluggedStartLevel = in.readInt();
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeToParcelLocked(out, flags);
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writeToParcelLocked(Parcel out, int flags) {
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastUptime);
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastRealtime);
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
2219105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
2220105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastUptime);
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastRealtime);
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
2234105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        out.writeInt(mUnpluggedStartLevel);
2235105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        out.writeInt(mPluggedStartLevel);
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int size = mUidStats.size();
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(size);
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < size; i++) {
22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(i));
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid uid = mUidStats.valueAt(i);
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uid.writeToParcelLocked(out, batteryRealtime);
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void dumpLocked(Printer pw) {
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "*** Screen timer:");
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.logState();
22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.i(TAG, "*** Phone timer:");
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.logState();
2265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            Log.i(TAG, "*** Wifi timer:");
2266105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.logState();
2267105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            Log.i(TAG, "*** Bluetooth timer:");
2268105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.logState();
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2273