BatteryStatsImpl.java revision 1d442e0d990b581357f33f5463c7c5cb49b551e8
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;
24c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport android.os.Process;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemClock;
26627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap;
39c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.HashSet;
40c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map;
42c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Set;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.  All times are represented in microseconds except where indicated
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise.
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats {
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final String TAG = "BatteryStatsImpl";
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final boolean DEBUG = false;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private static final int MAGIC = 0xBA757475; // 'BATSTATS'
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Current on-disk Parcel version
57c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int VERSION = 34;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mFile;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private final File mBackupFile;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics we have collected organized by uids.
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final SparseArray<BatteryStatsImpl.Uid> mUidStats =
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new SparseArray<BatteryStatsImpl.Uid>();
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // A set of pools of currently active timers.  When a timer is queried, we will divide the
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // elapsed time by the number of active timers to arrive at that timer's share of the time.
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // In order to do this, we must refresh each timer whenever the number of active timers
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // changes.
72c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>();
73c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>();
74c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>();
75c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers
76c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            = new SparseArray<ArrayList<StopwatchTimer>>();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // These are the objects that will want to do something when the device
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // is unplugged from power.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int mStartCount;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryUptime;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastUptime;
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryRealtime;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mBatteryLastRealtime;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptime;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUptimeStart;
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastUptime;
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtime;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mRealtimeStart;
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastRealtime;
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mScreenOn;
97c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mScreenOnTimer;
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
99617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mScreenBrightnessBin = -1;
100c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
102617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    Counter mInputEventCounter;
103617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mPhoneOn;
105c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mPhoneOnTimer;
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
107627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneSignalStrengthBin = -1;
108c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneSignalStrengthsTimer =
109c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS];
110627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
111627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    int mPhoneDataConnectionType = -1;
112c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    final StopwatchTimer[] mPhoneDataConnectionsTimer =
113c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
114627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mWifiOn;
116c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiOnTimer;
117617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    int mWifiOnUid = -1;
118d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
119d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    boolean mWifiRunning;
120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mWifiRunningTimer;
121105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
122105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    boolean mBluetoothOn;
123c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    StopwatchTimer mBluetoothOnTimer;
124105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * These provide time bases that discount the time the device is plugged
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * in to power.
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBattery;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    boolean mOnBatteryInternal;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastUptime;
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryUptimeStart;
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryPastRealtime;
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mTrackBatteryRealtimeStart;
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryUptime;
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mUnpluggedBatteryRealtime;
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    /*
140105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
141105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project     */
142633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeStartLevel;
143633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    int mDischargeCurrentLevel;
144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long mLastWriteTime = 0; // Milliseconds
146c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
147c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
148c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
149c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
150c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final HashMap<String, SamplingTimer> mKernelWakelockStats =
151c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, SamplingTimer>();
152c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
153c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public Map<String, ? extends SamplingTimer> getKernelWakelockStats() {
154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mKernelWakelockStats;
155c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
156c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
157c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static int sKernelWakelockUpdateVersion = 0;
158c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
159c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private static final int[] PROC_WAKELOCKS_FORMAT = new int[] {
160c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_STRING,                // 0: name
161c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 1: count
162c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
163c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
164c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM,
165c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Process.PROC_TAB_TERM|Process.PROC_OUT_LONG,                  // 5: totalTime
166c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    };
167c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
168c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final String[] mProcWakelocksName = new String[3];
169c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final long[] mProcWakelocksData = new long[3];
170c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
171c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
172c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added
173c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * to mKernelWakelockStats.
174c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
175c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> mProcWakelockFileStats =
176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            new HashMap<String, KernelWakelockStats>();
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // For debugging
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl() {
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static interface Unpluggable {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void unplug(long batteryUptime, long batteryRealtime);
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void plug(long batteryUptime, long batteryRealtime);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
189617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     * State for keeping track of counting information.
190617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn     */
191617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public static final class Counter extends BatteryStats.Counter implements Unpluggable {
192617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mCount;
193617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLoadedCount;
194617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mLastCount;
195617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mUnpluggedCount;
196617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int mPluggedCount;
197617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables, Parcel in) {
199617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mPluggedCount = mCount = in.readInt();
200617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLoadedCount = in.readInt();
201617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLastCount = in.readInt();
202617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = in.readInt();
203617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
205617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
206617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter(ArrayList<Unpluggable> unpluggables) {
207617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            unpluggables.add(this);
208617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
209617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
210617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void writeToParcel(Parcel out) {
211617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mCount);
212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLoadedCount);
213617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mLastCount);
214617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mUnpluggedCount);
215617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
216617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
217617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void unplug(long batteryUptime, long batteryRealtime) {
218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = mCount = mPluggedCount;
219617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void plug(long batteryUptime, long batteryRealtime) {
222617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mPluggedCount = mCount;
223617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
224617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
225617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        /**
226617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * Writes a possibly null Counter to a Parcel.
227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         *
228617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param out the Parcel to be written to.
229617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         * @param counter a Counter, or null.
230617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn         */
231617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public static void writeCounterToParcel(Parcel out, Counter counter) {
232617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (counter == null) {
233617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0); // indicates null
234617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return;
235617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
236617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(1); // indicates non-null
237617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            counter.writeToParcel(out);
239617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
240617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
241617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
242c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            int val;
244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (which == STATS_LAST) {
245617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mLastCount;
246617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
247617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                val = mCount;
248617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (which == STATS_UNPLUGGED) {
249617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mUnpluggedCount;
250617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                } else if (which != STATS_TOTAL) {
251617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    val -= mLoadedCount;
252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
253617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
254617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return val;
256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void logState(Printer pw, String prefix) {
259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            pw.println(prefix + "mCount=" + mCount
260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mUnpluggedCount=" + mUnpluggedCount
262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    + " mPluggedCount=" + mPluggedCount);
263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void stepLocked() {
266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mCount++;
267617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
268617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
269617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void writeSummaryFromParcelLocked(Parcel out) {
270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mCount);
271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            out.writeInt(mCount - mLoadedCount);
272617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void readSummaryFromParcelLocked(Parcel in) {
275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mCount = mLoadedCount = in.readInt();
276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mLastCount = in.readInt();
277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUnpluggedCount = mPluggedCount = mCount;
278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    /**
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * State for keeping track of timing information.
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
284c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static abstract class Timer extends BatteryStats.Timer implements Unpluggable {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mType;
286c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mCount;
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLoadedCount;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mLastCount;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int mUnpluggedCount;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Times are in microseconds for better accuracy when dividing by the
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // lock count, and are in "battery realtime" units.
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we have accumulated since the start of the original
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * boot, to the last time something interesting happened in the
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * current run.
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTotalTime;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The total time we loaded for the previous runs.  Subtract this from
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * mTotalTime to find the time for the current run of the system.
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTime;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The run time of the last run of the system, as loaded from the
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * saved data.
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLastTime;
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The value of mTotalTime when unplug() was last called.  Subtract
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * this from mTotalTime to find the time since the last unplug from
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * power.
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mUnpluggedTime;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
322c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) {
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
324c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCount = in.readInt();
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedCount = in.readInt();
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastCount = in.readInt();
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = in.readInt();
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTotalTime = in.readLong();
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTime = in.readLong();
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastTime = in.readLong();
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = in.readLong();
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
336c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Timer(int type, ArrayList<Unpluggable> unpluggables) {
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mType = type;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            unpluggables.add(this);
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
340c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
341c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract long computeRunTimeLocked(long curBatteryRealtime);
342c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
343c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected abstract int computeCurrentCountLocked();
344c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void writeToParcel(Parcel out, long batteryRealtime) {
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mCount);
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLoadedCount);
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mLastCount);
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUnpluggedCount);
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeRunTimeLocked(batteryRealtime));
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTime);
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLastTime);
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mUnpluggedTime);
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void unplug(long batteryUptime, long batteryRealtime) {
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedTime=" + mUnpluggedTime
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " old mUnpluggedCount=" + mUnpluggedCount);
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedTime = computeRunTimeLocked(batteryRealtime);
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggedCount = mCount;
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (DEBUG && mType < 0) {
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Log.v(TAG, "unplug #" + mType
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + ": new mUnpluggedTime=" + mUnpluggedTime
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        + " new mUnpluggedCount=" + mUnpluggedCount);
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void plug(long batteryUptime, long batteryRealtime) {
373c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
374c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime
375c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + " old mTotalTime=" + mTotalTime);
376c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
377c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = computeRunTimeLocked(batteryRealtime);
378c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = computeCurrentCountLocked();
379c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (DEBUG && mType < 0) {
380c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Log.v(TAG, "plug #" + mType
381c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        + ": new mTotalTime=" + mTotalTime);
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Writes a possibly null Timer to a Parcel.
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         *
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param out the Parcel to be written to.
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * @param timer a Timer, or null.
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public static void writeTimerToParcel(Parcel out, Timer timer,
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long batteryRealtime) {
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timer == null) {
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(0); // indicates null
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(1); // indicates non-null
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            timer.writeToParcel(out, batteryRealtime);
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
403c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long getTotalTimeLocked(long batteryRealtime, int which) {
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long val;
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastTime;
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = computeRunTimeLocked(batteryRealtime);
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedTime;
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedTime;
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
420c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getCountLocked(int which) {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int val;
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                val = mLastCount;
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
425c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                val = computeCurrentCountLocked();
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mUnpluggedCount;
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which != STATS_TOTAL) {
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val -= mLoadedCount;
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return val;
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
436627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        public void logState(Printer pw, String prefix) {
437c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + " mCount=" + mCount
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedCount=" + mUnpluggedCount);
440627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mTotalTime=" + mTotalTime
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mLoadedTime=" + mLoadedTime);
442627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            pw.println(prefix + "mLastTime=" + mLastTime
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mUnpluggedTime=" + mUnpluggedTime);
444c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
445c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
446c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
447c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
448c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            long runTime = computeRunTimeLocked(batteryRealtime);
449c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Divide by 1000 for backwards compatibility
450c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong((runTime + 500) / 1000);
451c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(((runTime - mLoadedTime) + 500) / 1000);
452c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount);
453c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCount - mLoadedCount);
454c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
455c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
456c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Multiply by 1000 for backwards compatibility
458c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = mLoadedTime = in.readLong() * 1000;
459c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mLastTime = in.readLong() * 1000;
460c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedTime = mTotalTime;
461c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = mLoadedCount = in.readInt();
462c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mLastCount = in.readInt();
463c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedCount = mCount;
464c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
465c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
466c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
467c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class SamplingTimer extends Timer {
468c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
469c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
470c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported count from /proc/wakelocks.
471c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
472c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mCurrentReportedCount;
473c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
474c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
475c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported count from /proc/wakelocks when unplug() was last
476c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
478c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUnpluggedReportedCount;
479c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
481c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The most recent reported total_time from /proc/wakelocks.
482c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
483c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mCurrentReportedTotalTime;
484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
485c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
486c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
487c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The reported total_time from /proc/wakelocks when unplug() was last
488c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * called.
489c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
490c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUnpluggedReportedTotalTime;
491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
492c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
493c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently in a discharge cycle.
494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
495c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mInDischarge;
496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
497c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
498c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * Whether we are currently recording reported values.
499c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
500c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        boolean mTrackingReportedValues;
501c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
502c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /*
503c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * A sequnce counter, incremented once for each update of the stats.
504c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
505c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mUpdateVersion;
506c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
507c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) {
508c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables, in);
509c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = in.readInt();
510c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = in.readInt();
511c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = in.readLong();
512c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = in.readLong();
513c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
514c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
515c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
516c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
517c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge,
518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                boolean trackReportedValues) {
519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(0, unpluggables);
520c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = trackReportedValues;
521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = inDischarge;
522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setStale() {
525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = false;
526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = 0;
527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = 0;
528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
529c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void setUpdateVersion(int version) {
531c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateVersion = version;
532c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
533c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
534c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int getUpdateVersion() {
535c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUpdateVersion;
536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedCount(int count) {
539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedCount == 0) {
540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = count;
542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedCount = count;
546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void updateCurrentReportedTotalTime(long totalTime) {
549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mInDischarge && mUnpluggedReportedTotalTime == 0) {
550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Updating the reported value for the first time.
551c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = totalTime;
552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // If we are receiving an update update mTrackingReportedValues;
553c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mTrackingReportedValues = true;
554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCurrentReportedTotalTime = totalTime;
556c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void unplug(long batteryUptime, long batteryRealtime) {
559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.unplug(batteryUptime, batteryRealtime);
560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mTrackingReportedValues) {
561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUnpluggedReportedCount = mCurrentReportedCount;
563c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
564c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = true;
565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
567c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
568c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.plug(batteryUptime, batteryRealtime);
569c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mInDischarge = false;
570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
578c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
579c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
580c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
581c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mTotalTime + (mInDischarge && mTrackingReportedValues
582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
584c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
585c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
586c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount + (mInDischarge && mTrackingReportedValues
587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mUnpluggedReportedCount);
594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
595c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUnpluggedReportedTotalTime);
596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
597c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
598c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeSummaryFromParcelLocked(out, batteryRealtime);
601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mCurrentReportedTotalTime);
602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mCurrentReportedCount);
603c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeInt(mTrackingReportedValues ? 1 : 0);
604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        void readSummaryFromParcelLocked(Parcel in) {
607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
610c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTrackingReportedValues = in.readInt() == 1;
611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /**
615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * State for keeping track of timing information.
616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public static final class StopwatchTimer extends Timer {
618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        final ArrayList<StopwatchTimer> mTimerPool;
619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int mNesting;
620c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
623c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The last time at which we updated the timer.  If mNesting is > 0,
624c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * subtract this from the current battery time to find the amount of
625c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * time we have been running since we last computed an update.
626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mUpdateTime;
628c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        /**
630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * The total time at which the timer was acquired, to determine if
631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         * was actually held for an interesting duration.
632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar         */
633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long mAcquireTime;
634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool,
637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables, Parcel in) {
638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables, in);
639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mUpdateTime = in.readLong();
641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool,
644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<Unpluggable> unpluggables) {
645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super(type, unpluggables);
646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTimerPool = timerPool;
647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void writeToParcel(Parcel out, long batteryRealtime) {
650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.writeToParcel(out, batteryRealtime);
651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            out.writeLong(mUpdateTime);
652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void plug(long batteryUptime, long batteryRealtime) {
655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (mNesting > 0) {
656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                super.plug(batteryUptime, batteryRealtime);
660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mUpdateTime = batteryRealtime;
661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (DEBUG && mType < 0) {
662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public void logState(Printer pw, String prefix) {
668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.logState(pw, prefix);
669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    + " mAcquireTime=" + mAcquireTime);
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void startRunningLocked(BatteryStatsImpl stats) {
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting++ == 0) {
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUpdateTime = stats.getBatteryRealtimeLocked(
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        SystemClock.elapsedRealtime() * 1000);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all currently active timers before adding
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // this new one to the pool.
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Add this timer to the active pool
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.add(this);
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // Increment the count
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mCount++;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mAcquireTime = mTotalTime;
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void stopRunningLocked(BatteryStatsImpl stats) {
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Ignore attempt to stop a timer that isn't running
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mNesting == 0) {
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return;
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (--mNesting == 0) {
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTimerPool != null) {
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Accumulate time to all active counters, scaled by the total
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // active in the pool, before taking this one out of the pool.
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refreshTimersLocked(stats, mTimerPool);
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // Remove this timer from the active pool
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTimerPool.remove(this);
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long realtime = SystemClock.elapsedRealtime() * 1000;
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 1;
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTotalTime = computeRunTimeLocked(batteryRealtime);
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mNesting = 0;
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (DEBUG && mType < 0) {
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mTotalTime=" + mTotalTime + " mCount=" + mCount
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            + " mAcquireTime=" + mAcquireTime);
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (mTotalTime == mAcquireTime) {
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // If there was no change in the time, then discard this
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    // count.  A somewhat cheezy strategy, but hey.
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mCount--;
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Update the total time for all other running Timers with the same type as this Timer
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // due to a change in timer count
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        private static void refreshTimersLocked(final BatteryStatsImpl stats,
732c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final ArrayList<StopwatchTimer> pool) {
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long realtime = SystemClock.elapsedRealtime() * 1000;
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime);
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int N = pool.size();
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int i=N-1; i>= 0; i--) {
737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                final StopwatchTimer t = pool.get(i);
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long heldTime = batteryRealtime - t.mUpdateTime;
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (heldTime > 0) {
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t.mTotalTime += heldTime / N;
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.mUpdateTime = batteryRealtime;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
746c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
747c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected long computeRunTimeLocked(long curBatteryRealtime) {
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mTotalTime + (mNesting > 0
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (curBatteryRealtime - mUpdateTime)
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            / (mTimerPool != null ? mTimerPool.size() : 1)
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : 0);
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
754c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        @Override
755c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        protected int computeCurrentCountLocked() {
756c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mCount;
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readSummaryFromParcelLocked(Parcel in) {
760c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            super.readSummaryFromParcelLocked(in);
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mNesting = 0;
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
765c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> readKernelWakelockStats() {
766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        byte[] buffer = new byte[4096];
768c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int len;
769c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
770c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        try {
771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            FileInputStream is = new FileInputStream("/proc/wakelocks");
772c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            len = is.read(buffer);
773c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            is.close();
774c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
775c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (len > 0) {
776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                int i;
777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (i=0; i<len; i++) {
778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (buffer[i] == '\0') {
779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        len = i;
780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        break;
781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.FileNotFoundException e) {
785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        } catch (java.io.IOException e) {
787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return null;
788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return parseProcWakelocks(buffer, len);
791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
792c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
793c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private final Map<String, KernelWakelockStats> parseProcWakelocks(
794c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            byte[] wlBuffer, int len) {
795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        String name;
796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int count;
797c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        long totalTime;
798c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int startIndex, endIndex;
799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int numUpdatedWlNames = 0;
800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        // Advance past the first line.
802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int i;
803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++);
804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        startIndex = endIndex = i + 1;
805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        synchronized(this) {
807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Map<String, KernelWakelockStats> m = mProcWakelockFileStats;
808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            sKernelWakelockUpdateVersion++;
810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            while (endIndex < len) {
811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                for (endIndex=startIndex;
812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0';
813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        endIndex++);
814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                endIndex++; // endIndex is an exclusive upper bound.
815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String[] nameStringArray = mProcWakelocksName;
817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                long[] wlData = mProcWakelocksData;
818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Process.parseProcLine(wlBuffer, startIndex, endIndex, PROC_WAKELOCKS_FORMAT,
819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        nameStringArray, wlData, null);
820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                name = nameStringArray[0];
822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                count = (int) wlData[1];
823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // convert nanoseconds to microseconds with rounding.
824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                totalTime = (wlData[2] + 500) / 1000;
825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (name.length() > 0) {
827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (!m.containsKey(name)) {
828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        m.put(name, new KernelWakelockStats(count, totalTime,
829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                                sKernelWakelockUpdateVersion));
830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        numUpdatedWlNames++;
831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    } else {
832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        KernelWakelockStats kwlStats = m.get(name);
833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        if (kwlStats.mVersion == sKernelWakelockUpdateVersion) {
834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount += count;
835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime += totalTime;
836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        } else {
837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mCount = count;
838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mTotalTime = totalTime;
839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            kwlStats.mVersion = sKernelWakelockUpdateVersion;
840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                            numUpdatedWlNames++;
841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        }
842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                startIndex = endIndex;
845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (m.size() != numUpdatedWlNames) {
848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                // Don't report old data.
849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Iterator<KernelWakelockStats> itr = m.values().iterator();
850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                while (itr.hasNext()) {
851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    if (itr.next().mVersion != sKernelWakelockUpdateVersion) {
852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        itr.remove();
853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    }
854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return m;
857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
859c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
860c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    private class KernelWakelockStats {
861c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mCount;
862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public long mTotalTime;
863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public int mVersion;
864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        KernelWakelockStats(int count, long totalTime, int version) {
866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mCount = count;
867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mTotalTime = totalTime;
868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mVersion = version;
869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    /*
873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * Get the KernelWakelockTimer associated with name, and create a new one if one
874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     * doesn't already exist.
875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar     */
876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public SamplingTimer getKernelWakelockTimerLocked(String name) {
877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        SamplingTimer kwlt = mKernelWakelockStats.get(name);
878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (kwlt == null) {
879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    true /* track reported values */);
881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mKernelWakelockStats.put(name, kwlt);
882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return kwlt;
884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doUnplug(long batteryUptime, long batteryRealtime) {
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesReceived = NetStat.getUidRxBytes(u.mUid);
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mStartedTcpBytesSent = NetStat.getUidTxBytes(u.mUid);
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void doPlug(long batteryUptime, long batteryRealtime) {
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesReceived >= 0) {
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived();
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesReceived = -1;
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (u.mStartedTcpBytesSent >= 0) {
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent();
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                u.mStartedTcpBytesSent = -1;
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.get(uid).noteStartGps();
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.get(uid).noteStopGps();
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOnLocked() {
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mScreenOn) {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = true;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.startRunningLocked(this);
928617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
929617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this);
930617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOffLocked() {
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mScreenOn) {
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOn = false;
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mScreenOnTimer.stopRunningLocked(this);
938617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenBrightnessBin >= 0) {
939617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
940617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
941617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
942617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
943617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
944617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightnessLocked(int brightness) {
945617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        // Bin the brightness.
946617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
947617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (bin < 0) bin = 0;
948617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
949617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mScreenBrightnessBin != bin) {
950617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mScreenOn) {
951617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (mScreenBrightnessBin >= 0) {
952617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this);
953617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
954617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mScreenBrightnessTimer[bin].startRunningLocked(this);
955617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
956617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessBin = bin;
957617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
958617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
959617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
960617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteInputEventLocked() {
961617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.stepLocked();
962617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
963617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
964617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivityLocked(int uid, int event) {
965617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Uid u = mUidStats.get(uid);
966617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (u != null) {
967617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.noteUserActivityLocked(event);
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOnLocked() {
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (!mPhoneOn) {
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = true;
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.startRunningLocked(this);
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOffLocked() {
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mPhoneOn) {
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOn = false;
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPhoneOnTimer.stopRunningLocked(this);
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
985627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneSignalStrengthLocked(int asu) {
986627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        // Bin the strength.
987627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin;
988627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
989627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT;
990627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        else if (asu >= 8)  bin = SIGNAL_STRENGTH_GOOD;
991627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        else if (asu >= 4)  bin = SIGNAL_STRENGTH_MODERATE;
992627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        else bin = SIGNAL_STRENGTH_POOR;
993627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneSignalStrengthBin != bin) {
994627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneSignalStrengthBin >= 0) {
995627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this);
996627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
997627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthBin = bin;
998627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[bin].startRunningLocked(this);
999627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1000627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1001627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1002627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
1003627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        int bin = DATA_CONNECTION_NONE;
1004627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (hasData) {
1005627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            switch (dataType) {
1006627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_EDGE:
1007627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_EDGE;
1008627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1009627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_GPRS:
1010627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_GPRS;
1011627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1012627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                case TelephonyManager.NETWORK_TYPE_UMTS:
1013627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_UMTS;
1014627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1015627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                default:
1016627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    bin = DATA_CONNECTION_OTHER;
1017627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                    break;
1018627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1019627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1020627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        if (mPhoneDataConnectionType != bin) {
1021627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            if (mPhoneDataConnectionType >= 0) {
1022627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this);
1023627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
1024627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionType = bin;
1025627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[bin].startRunningLocked(this);
1026627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
1027627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1028627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1029617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOnLocked(int uid) {
1030105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mWifiOn) {
1031105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = true;
1032105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.startRunningLocked(this);
1033105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1034617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid != uid) {
1035617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mWifiOnUid >= 0) {
1036617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                Uid u = mUidStats.get(mWifiOnUid);
1037617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u != null) {
1038617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.noteWifiTurnedOffLocked();
1039617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1040617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1041617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = uid;
1042617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            Uid u = mUidStats.get(uid);
1043617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u != null) {
1044617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                u.noteWifiTurnedOnLocked();
1045617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1046617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1047105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1048105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1049617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOffLocked(int uid) {
1050105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mWifiOn) {
1051105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOn = false;
1052105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mWifiOnTimer.stopRunningLocked(this);
1053105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1054617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        if (mWifiOnUid >= 0) {
1055617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            Uid u = mUidStats.get(mWifiOnUid);
1056617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u != null) {
1057617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                u.noteWifiTurnedOffLocked();
1058617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1059617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiOnUid = -1;
1060617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1061105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1062105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1063d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiRunningLocked() {
1064d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (!mWifiRunning) {
1065d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = true;
1066d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.startRunningLocked(this);
1067d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1068d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1069d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1070d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiStoppedLocked() {
1071d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        if (mWifiRunning) {
1072d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunning = false;
1073d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mWifiRunningTimer.stopRunningLocked(this);
1074d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
1075d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1076d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1077105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOnLocked() {
1078105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (!mBluetoothOn) {
1079105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = true;
1080105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.startRunningLocked(this);
1081105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1082105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1083105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1084105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOffLocked() {
1085105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (mBluetoothOn) {
1086105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOn = false;
1087105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mBluetoothOnTimer.stopRunningLocked(this);
1088105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1089105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1090105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1091105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquiredLocked(int uid) {
1092105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
1093105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
1094105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteFullWifiLockAcquiredLocked();
1095105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1096105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1097105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1098105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleasedLocked(int uid) {
1099105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
1100105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
1101105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteFullWifiLockReleasedLocked();
1102105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1103105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1104105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1105105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquiredLocked(int uid) {
1106105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
1107105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
1108105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteScanWifiLockAcquiredLocked();
1109105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1110105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1111105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1112105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleasedLocked(int uid) {
1113105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        Uid u = mUidStats.get(uid);
1114105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        if (u != null) {
1115105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.noteScanWifiLockReleasedLocked();
1116105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1117105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1118105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getScreenOnTime(long batteryRealtime, int which) {
1120c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which);
11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1123617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public long getScreenBrightnessTime(int brightnessBin,
1124617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            long batteryRealtime, int which) {
1125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
1126617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                batteryRealtime, which);
1127617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1128617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1129617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getInputEventCount(int which) {
1130c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mInputEventCounter.getCountLocked(which);
1131617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1132617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public long getPhoneOnTime(long batteryRealtime, int which) {
1134c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which);
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1137627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneSignalStrengthTime(int strengthBin,
1138627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
1139c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
1140627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
1141627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1142627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1143617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneSignalStrengthCount(int dataType, int which) {
1144c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
1145617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1146617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1147627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    @Override public long getPhoneDataConnectionTime(int dataType,
1148627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            long batteryRealtime, int which) {
1149c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
1150627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn                batteryRealtime, which);
1151627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
1152627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
1153617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    @Override public int getPhoneDataConnectionCount(int dataType, int which) {
1154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
1155617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
1156617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1157105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getWifiOnTime(long batteryRealtime, int which) {
1158c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which);
1159105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1160105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1161d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    @Override public long getWifiRunningTime(long batteryRealtime, int which) {
1162c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which);
1163d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
1164d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
1165105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override public long getBluetoothOnTime(long batteryRealtime, int which) {
1166c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which);
1167105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
1168105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public boolean getIsOnBattery() {
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mUidStats;
11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * The statistics associated with a particular uid.
11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public final class Uid extends BatteryStats.Uid {
11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int mUid;
11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesReceived;
11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mLoadedTcpBytesSent;
11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesReceived;
11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mCurrentTcpBytesSent;
11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesReceivedAtLastUnplug;
11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mTcpBytesSentAtLastUnplug;
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // These are not saved/restored when parcelling, since we want
11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // to return from the parcel with a snapshot of the state.
11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesReceived = -1;
11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long mStartedTcpBytesSent = -1;
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1195617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        boolean mWifiTurnedOn;
1196c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mWifiTurnedOnTimer;
1197617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1198105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mFullWifiLockOut;
1199c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mFullWifiLockTimer;
1200105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1201105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        boolean mScanWifiLockOut;
1202c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        StopwatchTimer mScanWifiLockTimer;
1203105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        Counter[] mUserActivityCounters;
1205617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's wake locks.
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>();
12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's sensor activations.
12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>();
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>();
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics we have collected for this uid's processes.
12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>();
12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Uid(int uid) {
12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUid = uid;
1228c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables);
1229c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables);
1230c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables);
12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mWakelockStats;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() {
12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mSensorStats;
12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mProcessStats;
12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        @Override
12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mPackageStats;
12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public int getUid() {
12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mUid;
12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesReceived(int which) {
12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesReceived;
12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesReceived();
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesReceivedAtLastUnplug;
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesReceived;
12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesReceived() {
12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long getTcpBytesSent(int which) {
12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (which == STATS_LAST) {
12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mLoadedTcpBytesSent;
12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long current = computeCurrentTcpBytesSent();
12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_UNPLUGGED) {
12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current -= mTcpBytesSentAtLastUnplug;
12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else if (which == STATS_TOTAL) {
12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    current += mLoadedTcpBytesSent;
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return current;
12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1290105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1291617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteWifiTurnedOnLocked() {
1292617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (!mWifiTurnedOn) {
1293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOn = true;
1294617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this);
1295617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1296617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1297617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1298617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1299617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteWifiTurnedOffLocked() {
1300617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mWifiTurnedOn) {
1301617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOn = false;
1302617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mWifiTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this);
1303617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1304617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1305617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1306617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1307105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockAcquiredLocked() {
1308105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mFullWifiLockOut) {
1309105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = true;
1310105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
1311105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1312105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1313105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1314105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1315105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteFullWifiLockReleasedLocked() {
1316105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mFullWifiLockOut) {
1317105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockOut = false;
1318105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
1319105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1320105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1321105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1322105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1323105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockAcquiredLocked() {
1324105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (!mScanWifiLockOut) {
1325105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = true;
1326105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this);
1327105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1328105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1329105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1330105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1331105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public void noteScanWifiLockReleasedLocked() {
1332105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            if (mScanWifiLockOut) {
1333105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockOut = false;
1334105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this);
1335105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            }
1336105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1337617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1338617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1339617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public long getWifiTurnedOnTime(long batteryRealtime, int which) {
1340c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mWifiTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which);
1341617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1342617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1343105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1344105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getFullWifiLockTime(long batteryRealtime, int which) {
1345c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
1346105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1347105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1348105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        @Override
1349105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        public long getScanWifiLockTime(long batteryRealtime, int which) {
1350c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which);
1351105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
1352105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
1353617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1354617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public void noteUserActivityLocked(int type) {
1355617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1356617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                initUserActivityLocked();
1357617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1358617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (type < 0) type = 0;
1359617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1;
1360617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters[type].stepLocked();
1361617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1362617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1363617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1364617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public boolean hasUserActivity() {
1365617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            return mUserActivityCounters != null;
1366617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1367617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1368617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        @Override
1369617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        public int getUserActivityCount(int type, int which) {
1370617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1371617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                return 0;
1372617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1373c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            return mUserActivityCounters[type].getCountLocked(which);
1374617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1375617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1376617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        void initUserActivityLocked() {
1377617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
1378617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1379617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters[i] = new Counter(mUnpluggables);
1380617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
1381617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
1382617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public long computeCurrentTcpBytesSent() {
13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ? (NetStat.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void writeToParcelLocked(Parcel out, long batteryRealtime) {
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mWakelockStats.size());
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) {
13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(wakelockEntry.getKey());
13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = wakelockEntry.getValue();
13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.writeToParcelLocked(out, batteryRealtime);
13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mSensorStats.size());
13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) {
13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(sensorEntry.getKey());
13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = sensorEntry.getValue();
14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.writeToParcelLocked(out, batteryRealtime);
14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mProcessStats.size());
14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) {
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(procEntry.getKey());
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = procEntry.getValue();
14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.writeToParcelLocked(out);
14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mPackageStats.size());
14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeString(pkgEntry.getKey());
14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = pkgEntry.getValue();
14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.writeToParcelLocked(out);
14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesReceived);
14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mLoadedTcpBytesSent);
14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesReceived());
14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(computeCurrentTcpBytesSent());
14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesReceivedAtLastUnplug);
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(mTcpBytesSentAtLastUnplug);
1423617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime);
1424105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockTimer.writeToParcel(out, batteryRealtime);
1425105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockTimer.writeToParcel(out, batteryRealtime);
1426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (mUserActivityCounters == null) {
1427617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
1428617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
1429617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
1430617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i].writeToParcel(out);
1432617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numWakelocks = in.readInt();
14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mWakelockStats.clear();
14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int j = 0; j < numWakelocks; j++) {
14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wakelockName = in.readString();
14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Wakelock wakelock = new Wakelock();
14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wakelock.readFromParcelLocked(unpluggables, in);
14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(wakelockName, wakelock);
14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numSensors = in.readInt();
14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mSensorStats.clear();
14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numSensors; k++) {
14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int sensorNumber = in.readInt();
14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Sensor sensor = new Sensor(sensorNumber);
14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sensor.readFromParcelLocked(mUnpluggables, in);
14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensorNumber, sensor);
14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numProcs = in.readInt();
14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mProcessStats.clear();
14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int k = 0; k < numProcs; k++) {
14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String processName = in.readString();
14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc proc = new Proc();
14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                proc.readFromParcelLocked(in);
14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(processName, proc);
14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int numPkgs = in.readInt();
14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mPackageStats.clear();
14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int l = 0; l < numPkgs; l++) {
14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String packageName = in.readString();
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg pkg = new Pkg();
14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                pkg.readFromParcelLocked(in);
14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(packageName, pkg);
14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesReceived = in.readLong();
14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLoadedTcpBytesSent = in.readLong();
14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesReceived = in.readLong();
14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCurrentTcpBytesSent = in.readLong();
14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesReceivedAtLastUnplug = in.readLong();
14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mTcpBytesSentAtLastUnplug = in.readLong();
1479617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mWifiTurnedOn = false;
1480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables, in);
1481105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mFullWifiLockOut = false;
1482c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables, in);
1483105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mScanWifiLockOut = false;
1484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables, in);
1485617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() == 0) {
1486617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = null;
1487617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
1488617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
1489617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
1490617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    mUserActivityCounters[i] = new Counter(mUnpluggables, in);
1491617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
1492617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular wake lock.
14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Wakelock extends BatteryStats.Uid.Wakelock {
14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device partially awake.
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1502c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerPartial;
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has been keeping the device fully awake.
15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1507c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerFull;
15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * How long (in ms) this uid has had a window keeping the device awake.
15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1512c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimerWindow;
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Reads a possibly null Timer from a Parcel.  The timer is associated with the
15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * proper timer pool from the given BatteryStatsImpl object.
15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             *
15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * @param in the Parcel to be read from.
15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * return a new Timer, or null.
15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
1521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    ArrayList<Unpluggable> unpluggables, Parcel in) {
15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return new StopwatchTimer(type, pool, unpluggables, in);
15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mPartialTimers, unpluggables, in);
15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL,
15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mFullTimers, unpluggables, in);
15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW,
15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mWindowTimers, unpluggables, in);
15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime);
15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime);
15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime);
15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getWakeTime(int type) {
15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                switch (type) {
15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL: return mTimerFull;
15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL: return mTimerPartial;
15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW: return mTimerWindow;
15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default: throw new IllegalArgumentException("type = " + type);
15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Sensor extends BatteryStats.Uid.Sensor {
15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final int mHandle;
1558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer mTimer;
15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Sensor(int handle) {
15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mHandle = handle;
15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1564c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables,
15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Parcel in) {
15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() == 0) {
15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (pool == null) {
1572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    pool = new ArrayList<StopwatchTimer>();
15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mSensorTimers.put(mHandle, pool);
15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
1575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                return new StopwatchTimer(0, pool, unpluggables, in);
15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) {
15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mTimer = readTimerFromParcel(unpluggables, in);
15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out, long batteryRealtime) {
15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Timer.writeTimerToParcel(out, mTimer, batteryRealtime);
15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Timer getSensorTime() {
15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mTimer;
15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getHandle() {
15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mHandle;
15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular process.
15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable {
16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in user code.
16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUserTime;
16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Total time (in 1/100 sec) spent executing in kernel code.
16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mSystemTime;
16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times the process has been started.
16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mStarts;
16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from a previous save.
16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedUserTime;
16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from a previous save.
16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLoadedSystemTime;
16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from a previous save.
16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedStarts;
16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time loaded from the previous run.
16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastUserTime;
16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time loaded from the previous run.
16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mLastSystemTime;
16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started from the previous run.
16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastStarts;
16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of user time when last unplugged.
16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedUserTime;
16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The amount of system time when last unplugged.
16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            long mUnpluggedSystemTime;
16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The number of times the process has started before unplugged.
16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedStarts;
16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc() {
16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = mUserTime;
16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = mSystemTime;
16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = mStarts;
16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
1674105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
1675105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project                final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
1676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUserTime);
16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mSystemTime);
16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mStarts);
16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedUserTime);
16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLoadedSystemTime);
16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedStarts);
16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastUserTime);
16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mLastSystemTime);
16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastStarts);
16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedUserTime);
16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeLong(mUnpluggedSystemTime);
16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedStarts);
16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime = in.readLong();
16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime = in.readLong();
16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts = in.readInt();
16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedUserTime = in.readLong();
16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedSystemTime = in.readLong();
16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedStarts = in.readInt();
16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastUserTime = in.readLong();
16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastSystemTime = in.readLong();
17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastStarts = in.readInt();
17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedUserTime = in.readLong();
17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedSystemTime = in.readLong();
17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedStarts = in.readInt();
17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void addCpuTimeLocked(int utime, int stime) {
17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUserTime += utime;
17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSystemTime += stime;
17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incStartsLocked() {
17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mStarts++;
17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getUserTime(int which) {
17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastUserTime;
17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mUserTime;
17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedUserTime;
17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedUserTime;
17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public long getSystemTime(int which) {
17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long val;
17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastSystemTime;
17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mSystemTime;
17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedSystemTime;
17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedSystemTime;
17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getStarts(int which) {
17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastStarts;
17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mStarts;
17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedStarts;
17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedStarts;
17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * The statistics associated with a particular package.
17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable {
17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of times this package has done something that could wake up the
17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * device from sleep.
17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mWakeups;
17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device loaded from a
17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * previous save.
17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLoadedWakeups;
17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mLastWakeups;
17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * Number of things that could wake up the device as of the
17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * last run.
17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int mUnpluggedWakeups;
17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statics we have collected for this package's services.
17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>();
18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg() {
18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggables.add(this);
18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void unplug(long batteryUptime, long batteryRealtime) {
18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = mWakeups;
18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void plug(long batteryUptime, long batteryRealtime) {
18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void readFromParcelLocked(Parcel in) {
18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups = in.readInt();
18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLoadedWakeups = in.readInt();
18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mLastWakeups = in.readInt();
18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mUnpluggedWakeups = in.readInt();
18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int numServs = in.readInt();
18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mServiceStats.clear();
18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int m = 0; m < numServs; m++) {
18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String serviceName = in.readString();
18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = new Serv();
18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mServiceStats.put(serviceName, serv);
18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.readFromParcelLocked(in);
18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            void writeToParcelLocked(Parcel out) {
18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mWakeups);
18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLoadedWakeups);
18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mLastWakeups);
18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mUnpluggedWakeups);
18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                out.writeInt(mServiceStats.size());
18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) {
18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(servEntry.getKey());
18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv serv = servEntry.getValue();
18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    serv.writeToParcelLocked(out);
18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mServiceStats;
18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            @Override
18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public int getWakeups(int which) {
18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int val;
18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (which == STATS_LAST) {
18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mLastWakeups;
18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    val = mWakeups;
18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_CURRENT) {
18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mLoadedWakeups;
18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else if (which == STATS_UNPLUGGED) {
18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val -= mUnpluggedWakeups;
18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return val;
18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            /**
18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             * The statistics associated with a particular service.
18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project             */
18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable {
18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left started.
18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mStartTime;
18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been started and not yet stopped, this is
18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was started.
18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mRunningSince;
18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently running.
18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mRunning;
18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number of times startService() has been called.
18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mStarts;
18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total time (ms in battery uptime) the service has been left launched.
18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedTime;
18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * If service has been launched and not yet exited, this is
18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * when it was launched (ms in battery uptime).
18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLaunchedSince;
19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * True if we are currently launched.
19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                boolean mLaunched;
19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * Total number times the service has been launched.
19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLaunches;
19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started loaded from a previous save
19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * (ms in battery uptime).
19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLoadedStartTime;
19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts loaded from a previous save.
19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedStarts;
19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches loaded from a previous save.
19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLoadedLaunches;
19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started as of the last run (ms
19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mLastStartTime;
19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts as of the last run.
19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastStarts;
19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches as of the last run.
19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mLastLaunches;
19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The amount of time spent started when last unplugged (ms
19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * in battery uptime).
19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mUnpluggedStartTime;
19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of starts when last unplugged.
19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedStarts;
19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                /**
19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 * The number of launches when last unplugged.
19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                 */
19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int mUnpluggedLaunches;
19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Serv() {
19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggables.add(this);
19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void unplug(long batteryUptime, long batteryRealtime) {
19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime);
19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = mStarts;
19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = mLaunches;
19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void plug(long batteryUptime, long batteryRealtime) {
19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void readFromParcelLocked(Parcel in) {
19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStartTime = in.readLong();
19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunningSince = in.readLong();
19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mRunning = in.readInt() != 0;
19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mStarts = in.readInt();
19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedTime = in.readLong();
19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunchedSince = in.readLong();
19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunched = in.readInt() != 0;
19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLaunches = in.readInt();
19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStartTime = in.readLong();
19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedStarts = in.readInt();
19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLoadedLaunches = in.readInt();
19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStartTime = in.readLong();
19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastStarts = in.readInt();
19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mLastLaunches = in.readInt();
19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStartTime = in.readLong();
19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedStarts = in.readInt();
19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedLaunches = in.readInt();
19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                void writeToParcelLocked(Parcel out) {
19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mStartTime);
19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mRunningSince);
19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mRunning ? 1 : 0);
19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mStarts);
19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedTime);
19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLaunchedSince);
20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunched ? 1 : 0);
20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLaunches);
20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLoadedStartTime);
20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedStarts);
20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLoadedLaunches);
20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mLastStartTime);
20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastStarts);
20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mLastLaunches);
20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(mUnpluggedStartTime);
20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedStarts);
20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(mUnpluggedLaunches);
20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getLaunchTimeToNowLocked(long batteryUptime) {
20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) return mLaunchedTime;
20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mLaunchedTime + batteryUptime - mLaunchedSince;
20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long getStartTimeToNowLocked(long batteryUptime) {
20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) return mStartTime;
20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return mStartTime + batteryUptime - mRunningSince;
20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startLaunchedLocked() {
20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mLaunched) {
20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunches++;
20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunchedSince = getBatteryUptimeLocked();
20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = true;
20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopLaunchedLocked() {
20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mLaunched) {
20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mLaunchedSince;
20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunchedTime += time;
20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mLaunches--;
20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mLaunched = false;
20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void startRunningLocked() {
20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (!mRunning) {
20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mStarts++;
20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunningSince = getBatteryUptimeLocked();
20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = true;
20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public void stopRunningLocked() {
20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mRunning) {
20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        long time = getBatteryUptimeLocked() - mRunningSince;
20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (time > 0) {
20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStartTime += time;
20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else {
20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            mStarts--;
20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        mRunning = false;
20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public BatteryStatsImpl getBatteryStats() {
20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return BatteryStatsImpl.this;
20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getLaunches(int which) {
20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastLaunches;
20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLaunches;
20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedLaunches;
20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedLaunches;
20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public long getStartTime(long now, int which) {
20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    long val;
20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStartTime;
20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = getStartTimeToNowLocked(now);
20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStartTime;
20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStartTime;
20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                @Override
21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                public int getStarts(int which) {
21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    int val;
21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (which == STATS_LAST) {
21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mLastStarts;
21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        val = mStarts;
21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        if (which == STATS_CURRENT) {
21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mLoadedStarts;
21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        } else if (which == STATS_UNPLUGGED) {
21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            val -= mUnpluggedStarts;
21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return val;
21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public BatteryStatsImpl getBatteryStats() {
21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return BatteryStatsImpl.this;
21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            public void incWakeupsLocked() {
21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakeups++;
21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            final Serv newServiceStatsLocked() {
21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return new Serv();
21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular process, creating
21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Proc getProcessStatsLocked(String name) {
21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Proc ps = mProcessStats.get(name);
21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Proc();
21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mProcessStats.put(name, ps);
21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg getPackageStatsLocked(String name) {
21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = mPackageStats.get(name);
21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ps == null) {
21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps = new Pkg();
21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPackageStats.put(name, ps);
21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ps;
21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        /**
21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * Retrieve the statistics object for a particular service, creating
21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         * if needed.
21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project         */
21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg ps = getPackageStatsLocked(pkg);
21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Pkg.Serv ss = ps.mServiceStats.get(serv);
21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (ss == null) {
21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ss = ps.newServiceStatsLocked();
21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                ps.mServiceStats.put(serv, ss);
21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return ss;
21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getWakeTimerLocked(String name, int type) {
21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Wakelock wl = mWakelockStats.get(name);
21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (wl == null) {
21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                wl = new Wakelock();
21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mWakelockStats.put(name, wl);
21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2182c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = null;
21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            switch (type) {
21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_PARTIAL:
21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerPartial;
21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2187c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_PARTIAL, mPartialTimers, mUnpluggables);
21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial = t;
21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_FULL:
21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerFull;
21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2194c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_FULL, mFullTimers, mUnpluggables);
21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull = t;
21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                case WAKE_TYPE_WINDOW:
21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    t = wl.mTimerWindow;
22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (t == null) {
2201c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        t = new StopwatchTimer(WAKE_TYPE_WINDOW, mWindowTimers, mUnpluggables);
22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow = t;
22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return t;
22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                default:
22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    throw new IllegalArgumentException("type=" + type);
22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Sensor se = mSensorStats.get(sensor);
22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (se == null) {
22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!create) {
22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return null;
22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                se = new Sensor(sensor);
22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorStats.put(sensor, se);
22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2219c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = se.mTimer;
22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return t;
22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2223c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (timers == null) {
2225c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                timers = new ArrayList<StopwatchTimer>();
22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mSensorTimers.put(sensor, timers);
22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
2228c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            t = new StopwatchTimer(BatteryStats.SENSOR, timers, mUnpluggables);
22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            se.mTimer = t;
22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return t;
22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartWakeLocked(String name, int type) {
2234c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopWakeLocked(String name, int type) {
2241c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getWakeTimerLocked(name, type);
22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartSensor(int sensor) {
2248c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, true);
22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopSensor(int sensor) {
22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            // Don't create a timer if one doesn't already exist
2256c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(sensor, false);
22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStartGps() {
2263c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.startRunningLocked(BatteryStatsImpl.this);
22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public void noteStopGps() {
2270c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (t != null) {
22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                t.stopRunningLocked(BatteryStatsImpl.this);
22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl getBatteryStats() {
22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return BatteryStatsImpl.this;
22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(String filename) {
22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = new File(filename);
22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBackupFile = new File(filename + ".bak");
22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
2285c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables);
2286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
2287c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables);
2288617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2289617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables);
2290c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables);
2291627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2292c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables);
2293627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2294627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2295c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables);
2296627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2297c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiOnTimer = new StopwatchTimer(-3, null, mUnpluggables);
2298c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiRunningTimer = new StopwatchTimer(-4, null, mUnpluggables);
2299c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mBluetoothOnTimer = new StopwatchTimer(-5, null, mUnpluggables);
23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = mOnBatteryInternal = false;
23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = 0;
23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = 0;
23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000;
23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000;
23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart);
23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart);
2307633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = 0;
2308633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = 0;
23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl(Parcel p) {
23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFile = mBackupFile = null;
23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcel(p);
23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int getStartCount() {
23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStartCount;
23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mOnBattery;
23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2325105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnBattery(boolean onBattery, int level) {
23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized(this) {
2327c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            updateKernelWakelocksLocked();
23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mOnBattery != onBattery) {
23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOnBattery = mOnBatteryInternal = onBattery;
23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long uptime = SystemClock.uptimeMillis() * 1000;
23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long mSecRealtime = SystemClock.elapsedRealtime();
23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                long realtime = mSecRealtime * 1000;
23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (onBattery) {
23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryUptimeStart = uptime;
23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryRealtimeStart = realtime;
23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime);
23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime);
2339633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    mDischargeCurrentLevel = mDischargeStartLevel = level;
23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doUnplug(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime);
23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart;
23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart;
2344633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar                    mDischargeCurrentLevel = level;
23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    doPlug(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime));
23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if ((mLastWriteTime + (60 * 1000)) < mSecRealtime) {
23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (mFile != null) {
23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        writeLocked();
23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2355633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
2356633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public void recordCurrentLevel(int level) {
2357633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = level;
2358633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
2359c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2360c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    public void updateKernelWakelocksLocked() {
2361c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        Map<String, KernelWakelockStats> m = readKernelWakelockStats();
2362c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2363c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) {
2364c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            String name = ent.getKey();
2365c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            KernelWakelockStats kws = ent.getValue();
2366c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2367c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = mKernelWakelockStats.get(name);
2368c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt == null) {
2369c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal,
2370c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                        true /* track reported values */);
2371c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(name, kwlt);
2372c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
2373c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedCount(kws.mCount);
2374c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
2375c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            kwlt.setUpdateVersion(sKernelWakelockUpdateVersion);
2376c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
2377c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
2378c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        if (m.size() != mKernelWakelockStats.size()) {
2379c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            // Set timers to stale if they didn't appear in /proc/wakelocks this time.
2380c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
2381c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer st = ent.getValue();
2382c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) {
2383c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                    st.setStale();
2384c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                }
2385c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
2386c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
2387c64edde69d18498fb2954f71a546357b07ab996aEvan Millar    }
23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeUptime(long curTime, int which) {
23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mUptime + (curTime-mUptimeStart);
24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastUptime;
24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mUptimeStart);
24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart);
24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeRealtime(long curTime, int which) {
24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart);
24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST: return mLastRealtime;
24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT: return (curTime-mRealtimeStart);
24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart);
24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryUptime(long curTime, int which) {
24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryUptime + getBatteryUptime(curTime);
24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastUptime;
24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptime(curTime);
24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime;
24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long computeBatteryRealtime(long curTime, int which) {
24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (which) {
24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_TOTAL:
24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryRealtime + getBatteryRealtimeLocked(curTime);
24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_LAST:
24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return mBatteryLastRealtime;
24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_CURRENT:
24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime);
24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            case STATS_UNPLUGGED:
24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime;
24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked(long curTime) {
24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastUptime;
24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryUptimeStart;
24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryUptimeLocked() {
24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptime(SystemClock.uptimeMillis() * 1000);
24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryUptime(long curTime) {
24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryUptimeLocked(curTime);
24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    long getBatteryRealtimeLocked(long curTime) {
24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        long time = mTrackBatteryPastRealtime;
24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mOnBatteryInternal) {
24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            time += curTime - mTrackBatteryRealtimeStart;
24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return time;
24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getBatteryRealtime(long curTime) {
24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return getBatteryRealtimeLocked(curTime);
24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2478105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2479105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
2480633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevel() {
2481105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
2482633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeStartLevelLocked();
2483105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2484105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2485105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2486633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeStartLevelLocked() {
2487633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return mDischargeStartLevel;
2488105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2489105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2490105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    @Override
2491633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevel() {
2492105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized(this) {
2493633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return getDischargeCurrentLevelLocked();
2494105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
2495105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2496105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2497633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public int getDischargeCurrentLevelLocked() {
2498633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar            return mDischargeCurrentLevel;
2499105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular uid, creating if needed.
25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid getUidStatsLocked(int uid) {
25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = mUidStats.get(uid);
25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (u == null) {
25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u = new Uid(uid);
25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u;
25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Remove the statistics object for a particular uid.
25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void removeUidStatsLocked(int uid) {
25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.remove(uid);
25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Proc getProcessStatsLocked(int uid, String name) {
25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getProcessStatsLocked(name);
25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular process, creating
25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getPackageStatsLocked(pkg);
25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Retrieve the statistics object for a particular service, creating
25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * if needed.
25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Uid u = getUidStatsLocked(uid);
25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return u.getServiceStatsLocked(pkg, name);
25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeLocked() {
25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "writeLocked: no file associated with this instance");
25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Keep the old file around until we know the new one has
25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // been successfully written.
25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mFile.exists()) {
25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (mBackupFile.exists()) {
25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mBackupFile.delete();
25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mFile.renameTo(mBackupFile);
25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            FileOutputStream stream = new FileOutputStream(mFile);
25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel out = Parcel.obtain();
25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            writeSummaryToParcel(out);
25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.write(out.marshall());
25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.recycle();
25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.flush();
25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mBackupFile.delete();
25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mLastWriteTime = SystemClock.elapsedRealtime();
25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (IOException e) {
25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e("BatteryStats", "Error writing battery statistics", e);
25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static byte[] readFully(FileInputStream stream) throws java.io.IOException {
25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int pos = 0;
25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int avail = stream.available();
25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = new byte[avail];
25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        while (true) {
25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int amt = stream.read(data, pos, data.length-pos);
25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //Log.i("foo", "Read " + amt + " bytes at " + pos
25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //        + " of avail " + data.length);
25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (amt <= 0) {
25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //Log.i("foo", "**** FINISHED READING: pos=" + pos
25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                //        + " len=" + data.length);
25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                return data;
25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pos += amt;
25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            avail = stream.available();
25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (avail > data.length-pos) {
25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                byte[] newData = new byte[pos+avail];
25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                System.arraycopy(data, 0, newData, 0, pos);
25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                data = newData;
25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readLocked() {
26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((mFile == null) || (mBackupFile == null)) {
26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readLocked: no file associated with this instance");
26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        FileInputStream stream = null;
26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mBackupFile.exists()) {
26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mBackupFile);
26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } catch (java.io.IOException e) {
26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                // We'll try for the normal settings file.
26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (stream == null) {
26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!mFile.exists()) {
26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    return;
26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                stream = new FileInputStream(mFile);
26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            byte[] raw = readFully(stream);
26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel in = Parcel.obtain();
26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.unmarshall(raw, 0, raw.length);
26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            in.setDataPosition(0);
26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            stream.close();
26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            readSummaryFromParcel(in);
26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch(java.io.IOException e) {
26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.e("BatteryStats", "Error reading battery statistics", e);
26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public int describeContents() {
26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return 0;
26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    private void readSummaryFromParcel(Parcel in) {
26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int version = in.readInt();
26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (version != VERSION) {
26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Log.w("BatteryStats", "readFromParcel: version got " + version
26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                + ", expected " + VERSION + "; erasing old stats");
26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
2660633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = in.readInt();
2661633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
2662105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount++;
26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.readSummaryFromParcelLocked(in);
2667617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
2668617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
2669617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2670617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.readSummaryFromParcelLocked(in);
26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.readSummaryFromParcelLocked(in);
2673627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2674627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
2675627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2676627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2677627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
2678627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2679105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
2680105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.readSummaryFromParcelLocked(in);
2681d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
2682d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.readSummaryFromParcelLocked(in);
2683105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
2684105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.readSummaryFromParcelLocked(in);
26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2686c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
2687c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
2688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
2689c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String kwltName = in.readString();
2690c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
2691c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
2692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
2693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = in.readInt();
26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.put(uid, u);
26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2700617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOn = false;
2701617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in);
2702105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockOut = false;
2703105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
2704105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockOut = false;
2705105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.readSummaryFromParcelLocked(in);
2706105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2707617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (in.readInt() != 0) {
2708617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                if (u.mUserActivityCounters == null) {
2709617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.initUserActivityLocked();
2710617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
2711617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
2712617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
2713617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
2714617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2715617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = in.readInt();
27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int iw = 0; iw < NW; iw++) {
27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String wlName = in.readString();
27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = in.readInt();
27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int is = 0; is < NP; is++) {
27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                int seNumber = in.readInt();
27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (in.readInt() != 0) {
27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    u.getSensorTimerLocked(seNumber, true)
27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            .readSummaryFromParcelLocked(in);
27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String procName = in.readString();
27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Proc p = u.getProcessStatsLocked(procName);
27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mUserTime = p.mLoadedUserTime = in.readLong();
27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastUserTime = in.readLong();
27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mSystemTime = p.mLoadedSystemTime = in.readLong();
27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastSystemTime = in.readLong();
27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mStarts = p.mLoadedStarts = in.readInt();
27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastStarts = in.readInt();
27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = in.readInt();
27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            for (int ip = 0; ip < NP; ip++) {
27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                String pkgName = in.readString();
27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Uid.Pkg p = u.getPackageStatsLocked(pkgName);
27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mWakeups = p.mLoadedWakeups = in.readInt();
27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                p.mLastWakeups = in.readInt();
27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                final int NS = in.readInt();
27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (int is = 0; is < NS; is++) {
27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    String servName = in.readString();
27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStartTime = s.mLoadedStartTime = in.readLong();
27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStartTime = in.readLong();
27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mStarts = s.mLoadedStarts = in.readInt();
27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastStarts = in.readInt();
27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLaunches = s.mLoadedLaunches = in.readInt();
27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    s.mLastLaunches = in.readInt();
27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesReceived = in.readLong();
27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.mLoadedTcpBytesSent = in.readLong();
27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * disk.  This format does not allow a lossless round-trip.
27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param out the Parcel to be written to.
27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeSummaryToParcel(Parcel out) {
27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOW = getBatteryUptimeLocked(NOW_SYS);
27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS);
27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(VERSION);
27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL));
27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT));
27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL));
27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT));
27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL));
27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT));
27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL));
27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT));
2798633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeStartLevel);
2799633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
2800105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2803617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
2804617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
2805617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2806617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeSummaryFromParcelLocked(out);
28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2808627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2809627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
2810627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2811627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2812627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL);
2813627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2815d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
2819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
2820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            Timer kwlt = ent.getValue();
2821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
2822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
2823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
2824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL);
2825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
2826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
2827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
2828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
2829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final int NU = mUidStats.size();
28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(NU);
28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int iu = 0; iu < NU; iu++) {
28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(iu));
28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = mUidStats.valueAt(iu);
2835105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
2836617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            u.mWifiTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2837105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
2838105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL);
28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2840617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            if (u.mUserActivityCounters == null) {
2841617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(0);
2842617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            } else {
2843617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                out.writeInt(1);
2844617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
2845617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                    u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
2846617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn                }
2847617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
2848617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NW = u.mWakelockStats.size();
28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NW);
28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NW > 0) {
28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent
28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mWakelockStats.entrySet()) {
28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Wakelock wl = ent.getValue();
28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerFull != null) {
28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL);
28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerPartial != null) {
28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL);
28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (wl.mTimerWindow != null) {
28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL);
28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NSE = u.mSensorStats.size();
28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NSE);
28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NSE > 0) {
28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent
28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        : u.mSensorStats.entrySet()) {
28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ent.getKey());
28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Sensor se = ent.getValue();
28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (se.mTimer != null) {
28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(1);
28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL);
28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        out.writeInt(0);
28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int NP = u.mProcessStats.size();
28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent
28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mProcessStats.entrySet()) {
28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Proc ps = ent.getValue();
29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime);
29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mUserTime - ps.mLoadedUserTime);
29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime);
29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime);
29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts);
29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mStarts - ps.mLoadedStarts);
29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            NP = u.mPackageStats.size();
29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(NP);
29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (NP > 0) {
29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    : u.mPackageStats.entrySet()) {
29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeString(ent.getKey());
29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    Uid.Pkg ps = ent.getValue();
29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups);
29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(ps.mWakeups - ps.mLoadedWakeups);
29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    final int NS = ps.mServiceStats.size();
29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    out.writeInt(NS);
29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if (NS > 0) {
29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent
29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                : ps.mServiceStats.entrySet()) {
29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeString(sent.getKey());
29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue();
29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            long time = ss.getStartTimeToNowLocked(NOW);
29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time);
29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeLong(time - ss.mLoadedStartTime);
29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts);
29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mStarts - ss.mLoadedStarts);
29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches);
29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            out.writeInt(ss.mLaunches - ss.mLoadedLaunches);
29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        }
29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesReceived(STATS_TOTAL));
29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeLong(u.getTcpBytesSent(STATS_TOTAL));
29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void readFromParcel(Parcel in) {
29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        readFromParcelLocked(in);
29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void readFromParcelLocked(Parcel in) {
29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int magic = in.readInt();
29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (magic != MAGIC) {
29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ParcelFormatException("Bad magic number");
29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStartCount = in.readInt();
29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryUptime = in.readLong();
29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastUptime = in.readLong();
29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryRealtime = in.readLong();
29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mBatteryLastRealtime = in.readLong();
29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOn = false;
2958c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables, in);
2959617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
2960c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables, in);
2961617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
2962617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter = new Counter(mUnpluggables, in);
29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOn = false;
2964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
2965627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
2966c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables, in);
2967627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2968627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
2969c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables, in);
2970627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
2971105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOn = false;
2972c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
2973d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunning = false;
2974c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mWifiRunningTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
2975105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOn = false;
2976c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mBluetoothOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in);
29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptime = in.readLong();
29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUptimeStart = in.readLong();
29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastUptime = in.readLong();
29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtime = in.readLong();
29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mRealtimeStart = in.readLong();
29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastRealtime = in.readLong();
29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBattery = in.readInt() != 0;
29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOnBatteryInternal = false; // we are no longer really running.
29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastUptime = in.readLong();
29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryUptimeStart = in.readLong();
29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryPastRealtime = in.readLong();
29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mTrackBatteryRealtimeStart = in.readLong();
29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryUptime = in.readLong();
29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUnpluggedBatteryRealtime = in.readLong();
2991633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeStartLevel = in.readInt();
2992633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mDischargeCurrentLevel = in.readInt();
29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastWriteTime = in.readLong();
29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2995c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        mKernelWakelockStats.clear();
2996c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        int NKW = in.readInt();
2997c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (int ikw = 0; ikw < NKW; ikw++) {
2998c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (in.readInt() != 0) {
2999c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                String wakelockName = in.readString();
3000c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in);
3001c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                mKernelWakelockStats.put(wakelockName, kwlt);
3002c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3003c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3004c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPartialTimers.clear();
30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mFullTimers.clear();
30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mWindowTimers.clear();
30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int numUids = in.readInt();
30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mUidStats.clear();
30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < numUids; i++) {
30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            int uid = in.readInt();
30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid u = new Uid(uid);
30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            u.readFromParcelLocked(mUnpluggables, in);
30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mUidStats.append(uid, u);
30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void writeToParcel(Parcel out, int flags) {
30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        writeToParcelLocked(out, flags);
30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @SuppressWarnings("unused")
30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    void writeToParcelLocked(Parcel out, int flags) {
30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecUptime = SystemClock.uptimeMillis() * 1000;
30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryUptime = getBatteryUptimeLocked(uSecUptime);
30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime);
30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(MAGIC);
30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mStartCount);
30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryUptime);
30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastUptime);
30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryRealtime);
30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mBatteryLastRealtime);
30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mScreenOnTimer.writeToParcel(out, batteryRealtime);
3037617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
3038617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime);
3039617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
3040617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        mInputEventCounter.writeToParcel(out);
30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPhoneOnTimer.writeToParcel(out, batteryRealtime);
3042627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
3043627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime);
3044627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3045627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
3046627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime);
3047627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
3048105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mWifiOnTimer.writeToParcel(out, batteryRealtime);
3049d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        mWifiRunningTimer.writeToParcel(out, batteryRealtime);
3050105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mBluetoothOnTimer.writeToParcel(out, batteryRealtime);
30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptime);
30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUptimeStart);
30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastUptime);
30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtime);
30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mRealtimeStart);
30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastRealtime);
30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(mOnBattery ? 1 : 0);
30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryUptime);
30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryUptimeStart);
30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(batteryRealtime);
30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mTrackBatteryRealtimeStart);
30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryUptime);
30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mUnpluggedBatteryRealtime);
3064633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeStartLevel);
3065633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        out.writeInt(mDischargeCurrentLevel);
30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeLong(mLastWriteTime);
30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3068c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        out.writeInt(mKernelWakelockStats.size());
3069c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
3070c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            SamplingTimer kwlt = ent.getValue();
3071c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            if (kwlt != null) {
3072c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(1);
3073c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeString(ent.getKey());
3074c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                Timer.writeTimerToParcel(out, kwlt, batteryRealtime);
3075c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            } else {
3076c64edde69d18498fb2954f71a546357b07ab996aEvan Millar                out.writeInt(0);
3077c64edde69d18498fb2954f71a546357b07ab996aEvan Millar            }
3078c64edde69d18498fb2954f71a546357b07ab996aEvan Millar        }
3079c64edde69d18498fb2954f71a546357b07ab996aEvan Millar
30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int size = mUidStats.size();
30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.writeInt(size);
30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        for (int i = 0; i < size; i++) {
30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out.writeInt(mUidStats.keyAt(i));
30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Uid uid = mUidStats.valueAt(i);
30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            uid.writeToParcelLocked(out, batteryRealtime);
30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new Parcelable.Creator<BatteryStatsImpl>() {
30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl createFromParcel(Parcel in) {
30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl(in);
30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        public BatteryStatsImpl[] newArray(int size) {
30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return new BatteryStatsImpl[size];
30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
31011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn    public void dumpLocked(PrintWriter pw) {
31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (DEBUG) {
31031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            Printer pr = new PrintWriterPrinter(pw);
31041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Screen timer:");
31051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mScreenOnTimer.logState(pr, "  ");
3106617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
31071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Screen brightness #" + i + ":");
31081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mScreenBrightnessTimer[i].logState(pr, "  ");
3109617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            }
31101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Input event counter:");
31111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mInputEventCounter.logState(pr, "  ");
31121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Phone timer:");
31131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mPhoneOnTimer.logState(pr, "  ");
3114627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) {
31151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Signal strength #" + i + ":");
31161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneSignalStrengthsTimer[i].logState(pr, "  ");
3117627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            }
3118627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
31191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                pr.println("*** Data connection type #" + i + ":");
31201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn                mPhoneDataConnectionsTimer[i].logState(pr, "  ");
31211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            }
31221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Wifi timer:");
31231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiOnTimer.logState(pr, "  ");
31241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** WifiRunning timer:");
31251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mWifiRunningTimer.logState(pr, "  ");
31261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            pr.println("*** Bluetooth timer:");
31271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            mBluetoothOnTimer.logState(pr, "  ");
31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        super.dumpLocked(pw);
31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3132