BatteryStatsImpl.java revision d8593312296fd2193a070c1a074840d83b7f49cb
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 2363d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen if (m == null) { 2364d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen // Not crashing might make board bringup easier. 2365d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen Log.w(TAG, "Couldn't get kernel wake lock stats"); 2366d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen return; 2367d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen } 2368d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen 2369c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) { 2370c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name = ent.getKey(); 2371c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kws = ent.getValue(); 2372c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2373c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 2374c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 2375c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 2376c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 2377c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 2378c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2379c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedCount(kws.mCount); 2380c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); 2381c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.setUpdateVersion(sKernelWakelockUpdateVersion); 2382c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2383c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2384c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != mKernelWakelockStats.size()) { 2385c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Set timers to stale if they didn't appear in /proc/wakelocks this time. 2386c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 2387c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer st = ent.getValue(); 2388c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) { 2389c64edde69d18498fb2954f71a546357b07ab996aEvan Millar st.setStale(); 2390c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2391c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2392c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2393c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery(); 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeUptime(long curTime, int which) { 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: return mUptime + (curTime-mUptimeStart); 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastUptime; 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mUptimeStart); 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart); 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeRealtime(long curTime, int which) { 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart); 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastRealtime; 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mRealtimeStart); 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart); 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryUptime(long curTime, int which) { 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryUptime + getBatteryUptime(curTime); 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastUptime; 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(curTime); 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime; 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryRealtime(long curTime, int which) { 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryRealtime + getBatteryRealtimeLocked(curTime); 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastRealtime; 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime; 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked(long curTime) { 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastUptime; 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryUptimeStart; 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked() { 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(SystemClock.uptimeMillis() * 1000); 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryUptime(long curTime) { 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime); 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryRealtimeLocked(long curTime) { 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastRealtime; 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryRealtimeStart; 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryRealtime(long curTime) { 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2484105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2485105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2486633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevel() { 2487105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 2488633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeStartLevelLocked(); 2489105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2490105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2491105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2492633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevelLocked() { 2493633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return mDischargeStartLevel; 2494105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2495105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2496105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2497633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevel() { 2498105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 2499633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeCurrentLevelLocked(); 2500105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2501105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2502105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2503633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevelLocked() { 2504633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return mDischargeCurrentLevel; 2505105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular uid, creating if needed. 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid getUidStatsLocked(int uid) { 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.get(uid); 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u == null) { 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u = new Uid(uid); 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u; 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the statistics object for a particular uid. 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeUidStatsLocked(int uid) { 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.remove(uid); 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Proc getProcessStatsLocked(int uid, String name) { 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getProcessStatsLocked(name); 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg getPackageStatsLocked(int uid, String pkg) { 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getPackageStatsLocked(pkg); 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) { 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getServiceStatsLocked(pkg, name); 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeLocked() { 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mFile == null) || (mBackupFile == null)) { 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BatteryStats", "writeLocked: no file associated with this instance"); 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Keep the old file around until we know the new one has 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // been successfully written. 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFile.exists()) { 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBackupFile.exists()) { 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackupFile.delete(); 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile.renameTo(mBackupFile); 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream stream = new FileOutputStream(mFile); 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeSummaryToParcel(out); 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.write(out.marshall()); 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.flush(); 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackupFile.delete(); 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = SystemClock.elapsedRealtime(); 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("BatteryStats", "Error writing battery statistics", e); 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static byte[] readFully(FileInputStream stream) throws java.io.IOException { 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int avail = stream.available(); 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[avail]; 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int amt = stream.read(data, pos, data.length-pos); 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "Read " + amt + " bytes at " + pos 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " of avail " + data.length); 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt <= 0) { 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "**** FINISHED READING: pos=" + pos 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " len=" + data.length); 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos += amt; 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project avail = stream.available(); 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (avail > data.length-pos) { 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] newData = new byte[pos+avail]; 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(data, 0, newData, 0, pos); 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = newData; 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readLocked() { 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mFile == null) || (mBackupFile == null)) { 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BatteryStats", "readLocked: no file associated with this instance"); 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileInputStream stream = null; 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBackupFile.exists()) { 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream = new FileInputStream(mBackupFile); 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (java.io.IOException e) { 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We'll try for the normal settings file. 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stream == null) { 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mFile.exists()) { 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream = new FileInputStream(mFile); 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] raw = readFully(stream); 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in = Parcel.obtain(); 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.unmarshall(raw, 0, raw.length); 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.setDataPosition(0); 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSummaryFromParcel(in); 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(java.io.IOException e) { 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("BatteryStats", "Error reading battery statistics", e); 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSummaryFromParcel(Parcel in) { 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int version = in.readInt(); 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (version != VERSION) { 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BatteryStats", "readFromParcel: version got " + version 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", expected " + VERSION + "; erasing old stats"); 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastUptime = in.readLong(); 26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastRealtime = in.readLong(); 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUptime = in.readLong(); 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastRealtime = in.readLong(); 2666633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = in.readInt(); 2667633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 2668105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.readSummaryFromParcelLocked(in); 2673617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 2674617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); 2675617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2676617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.readSummaryFromParcelLocked(in); 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.readSummaryFromParcelLocked(in); 2679627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 2680627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in); 2681627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2682627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 2683627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in); 2684627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2685105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 2686105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.readSummaryFromParcelLocked(in); 2687d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 2688d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.readSummaryFromParcelLocked(in); 2689105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 2690105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.readSummaryFromParcelLocked(in); 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2692c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 2693c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 2694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 2695c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String kwltName = in.readString(); 2696c64edde69d18498fb2954f71a546357b07ab996aEvan Millar getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in); 2697c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2698c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2699c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = in.readInt(); 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2706617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOn = false; 2707617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in); 2708105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockOut = false; 2709105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); 2710105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockOut = false; 2711105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); 2712105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2713617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() != 0) { 2714617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 2715617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.initUserActivityLocked(); 2716617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2717617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 2718617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); 2719617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2720617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2721617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = in.readInt(); 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iw = 0; iw < NW; iw++) { 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wlName = in.readString(); 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in); 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in); 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in); 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = in.readInt(); 27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NP; is++) { 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int seNumber = in.readInt(); 27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getSensorTimerLocked(seNumber, true) 27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .readSummaryFromParcelLocked(in); 27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String procName = in.readString(); 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc p = u.getProcessStatsLocked(procName); 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mUserTime = p.mLoadedUserTime = in.readLong(); 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastUserTime = in.readLong(); 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mSystemTime = p.mLoadedSystemTime = in.readLong(); 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastSystemTime = in.readLong(); 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStarts = p.mLoadedStarts = in.readInt(); 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastStarts = in.readInt(); 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = in.readString(); 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg p = u.getPackageStatsLocked(pkgName); 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mWakeups = p.mLoadedWakeups = in.readInt(); 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastWakeups = in.readInt(); 27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = in.readInt(); 27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NS; is++) { 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String servName = in.readString(); 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStartTime = s.mLoadedStartTime = in.readLong(); 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastStartTime = in.readLong(); 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStarts = s.mLoadedStarts = in.readInt(); 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastStarts = in.readInt(); 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLaunches = s.mLoadedLaunches = in.readInt(); 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastLaunches = in.readInt(); 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesReceived = in.readLong(); 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesSent = in.readLong(); 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a summary of the statistics to a Parcel, in a format suitable to be written to 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disk. This format does not allow a lossless round-trip. 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeSummaryToParcel(Parcel out) { 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW_SYS = SystemClock.uptimeMillis() * 1000; 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000; 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW = getBatteryUptimeLocked(NOW_SYS); 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS); 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(VERSION); 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL)); 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT)); 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL)); 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT)); 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL)); 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT)); 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL)); 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT)); 2804633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeStartLevel); 2805633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 2806105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2809617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 2810617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 2811617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2812617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeSummaryFromParcelLocked(out); 28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2814627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 2815627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 2816627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2817627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 2818627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 2819627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2820105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2821d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2822105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 2825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 2826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer kwlt = ent.getValue(); 2827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 2828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 2829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 2830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL); 2831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 2832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 2833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = mUidStats.size(); 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NU); 28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(iu)); 28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 2841105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2842617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2843105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2844105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2846617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 2847617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 2848617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 2849617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 2850617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 2851617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); 2852617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2853617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2854617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = u.mWakelockStats.size(); 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NW); 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mWakelockStats.entrySet()) { 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerFull != null) { 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull.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.mTimerPartial != null) { 28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial.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 if (wl.mTimerWindow != null) { 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL); 28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NSE = u.mSensorStats.size(); 28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NSE); 28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NSE > 0) { 28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent 28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mSensorStats.entrySet()) { 28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ent.getKey()); 28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se.mTimer != null) { 28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL); 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = u.mProcessStats.size(); 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mProcessStats.entrySet()) { 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime); 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime - ps.mLoadedUserTime); 29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime); 29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime); 29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts); 29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts - ps.mLoadedStarts); 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = u.mPackageStats.size(); 29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent 29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mPackageStats.entrySet()) { 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups); 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups - ps.mLoadedWakeups); 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = ps.mServiceStats.size(); 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NS); 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NS > 0) { 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : ps.mServiceStats.entrySet()) { 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(sent.getKey()); 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue(); 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = ss.getStartTimeToNowLocked(NOW); 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time); 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time - ss.mLoadedStartTime); 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts); 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts - ss.mLoadedStarts); 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches); 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches - ss.mLoadedLaunches); 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(u.getTcpBytesReceived(STATS_TOTAL)); 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(u.getTcpBytesSent(STATS_TOTAL)); 29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readFromParcel(Parcel in) { 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcelLocked(in); 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = in.readInt(); 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != MAGIC) { 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ParcelFormatException("Bad magic number"); 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastUptime = in.readLong(); 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastRealtime = in.readLong(); 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 2964c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables, in); 2965617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 2966c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables, in); 2967617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2968617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables, in); 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 2970c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 2971627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 2972c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables, in); 2973627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2974627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 2975c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables, in); 2976627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2977105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 2978c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 2979d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 2980c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiRunningTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 2981105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 2982c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mBluetoothOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = in.readLong(); 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUptime = in.readLong(); 29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = in.readLong(); 29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastRealtime = in.readLong(); 29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = in.readInt() != 0; 29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBatteryInternal = false; // we are no longer really running. 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = in.readLong(); 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = in.readLong(); 29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = in.readLong(); 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = in.readLong(); 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = in.readLong(); 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = in.readLong(); 2997633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = in.readInt(); 2998633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = in.readLong(); 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3001c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.clear(); 3002c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 3003c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 3004c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 3005c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String wakelockName = in.readString(); 3006c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); 3007c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(wakelockName, kwlt); 3008c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3009c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3010c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers.clear(); 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers.clear(); 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers.clear(); 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numUids = in.readInt(); 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numUids; i++) { 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.readFromParcelLocked(mUnpluggables, in); 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.append(uid, u); 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeToParcelLocked(out, flags); 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, int flags) { 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecUptime = SystemClock.uptimeMillis() * 1000; 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptimeLocked(uSecUptime); 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(MAGIC); 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryUptime); 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryLastUptime); 30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryRealtime); 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryLastRealtime); 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeToParcel(out, batteryRealtime); 3043617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3044617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime); 3045617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3046617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeToParcel(out); 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeToParcel(out, batteryRealtime); 3048627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3049627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime); 3050627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3051627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3052627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime); 3053627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3054105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeToParcel(out, batteryRealtime); 3055d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.writeToParcel(out, batteryRealtime); 3056105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeToParcel(out, batteryRealtime); 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptime); 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptimeStart); 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastUptime); 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtime); 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtimeStart); 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastRealtime); 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mOnBattery ? 1 : 0); 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryUptime); 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryUptimeStart); 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryRealtime); 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryRealtimeStart); 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryUptime); 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryRealtime); 3070633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeStartLevel); 3071633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastWriteTime); 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3074c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 3075c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 3076c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = ent.getValue(); 3077c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 3078c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 3079c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 3080c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer.writeTimerToParcel(out, kwlt, batteryRealtime); 3081c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 3082c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 3083c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3084c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3085c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = mUidStats.size(); 30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(size); 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < size; i++) { 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(i)); 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid uid = mUidStats.valueAt(i); 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid.writeToParcelLocked(out, batteryRealtime); 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<BatteryStatsImpl> CREATOR = 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<BatteryStatsImpl>() { 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl createFromParcel(Parcel in) { 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl(in); 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl[] newArray(int size) { 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl[size]; 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void dumpLocked(PrintWriter pw) { 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) { 31091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 31101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen timer:"); 31111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenOnTimer.logState(pr, " "); 3112617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 31131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen brightness #" + i + ":"); 31141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenBrightnessTimer[i].logState(pr, " "); 3115617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 31161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Input event counter:"); 31171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mInputEventCounter.logState(pr, " "); 31181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Phone timer:"); 31191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneOnTimer.logState(pr, " "); 3120627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 31211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Signal strength #" + i + ":"); 31221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneSignalStrengthsTimer[i].logState(pr, " "); 3123627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3124627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 31251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Data connection type #" + i + ":"); 31261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneDataConnectionsTimer[i].logState(pr, " "); 31271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 31281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Wifi timer:"); 31291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiOnTimer.logState(pr, " "); 31301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** WifiRunning timer:"); 31311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiRunningTimer.logState(pr, " "); 31321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Bluetooth timer:"); 31331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mBluetoothOnTimer.logState(pr, " "); 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dumpLocked(pw); 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3138