BatteryStatsImpl.java revision 244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1
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; 26e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 27627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackbornimport android.telephony.TelephonyManager; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport android.util.PrintWriterPrinter; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.SparseArray; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileInputStream; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileOutputStream; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackbornimport java.io.PrintWriter; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.HashMap; 40c64edde69d18498fb2954f71a546357b07ab996aEvan Millarimport java.util.Iterator; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. All times are represented in microseconds except where indicated 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * otherwise. 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsImpl extends BatteryStats { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "BatteryStatsImpl"; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean DEBUG = false; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In-memory Parcel magic number, used to detect attempts to unmarshall bad data 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final int MAGIC = 0xBA757475; // 'BATSTATS' 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Current on-disk Parcel version 56244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani private static final int VERSION = 36; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final File mFile; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final File mBackupFile; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected organized by uids. 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final SparseArray<BatteryStatsImpl.Uid> mUidStats = 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new SparseArray<BatteryStatsImpl.Uid>(); 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // A set of pools of currently active timers. When a timer is queried, we will divide the 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // elapsed time by the number of active timers to arrive at that timer's share of the time. 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // In order to do this, we must refresh each timer whenever the number of active timers 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changes. 71c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<StopwatchTimer>(); 72c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<StopwatchTimer>(); 73c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<StopwatchTimer>(); 74c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers 75c64edde69d18498fb2954f71a546357b07ab996aEvan Millar = new SparseArray<ArrayList<StopwatchTimer>>(); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are the objects that will want to do something when the device 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // is unplugged from power. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ArrayList<Unpluggable> mUnpluggables = new ArrayList<Unpluggable>(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStartCount; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryUptime; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastUptime; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryRealtime; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mBatteryLastRealtime; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptime; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUptimeStart; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUptime; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtime; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRealtimeStart; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastRealtime; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mScreenOn; 96c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScreenOnTimer; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 98617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mScreenBrightnessBin = -1; 99c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS]; 100617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 101617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter mInputEventCounter; 102617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mPhoneOn; 104c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mPhoneOnTimer; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 106244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioOn; 107244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioOnTimer; 108244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 109244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoOn; 110244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoOnTimer; 111244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 112627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneSignalStrengthBin = -1; 113c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneSignalStrengthsTimer = 114c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_SIGNAL_STRENGTH_BINS]; 115627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 116627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int mPhoneDataConnectionType = -1; 117c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer[] mPhoneDataConnectionsTimer = 118c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new StopwatchTimer[NUM_DATA_CONNECTION_TYPES]; 119627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 120105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mWifiOn; 121c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiOnTimer; 122617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mWifiOnUid = -1; 123d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 124d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood boolean mWifiRunning; 125c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiRunningTimer; 126105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 127105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mBluetoothOn; 128c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mBluetoothOnTimer; 129105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * These provide time bases that discount the time the device is plugged 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in to power. 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBattery; 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mOnBatteryInternal; 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastUptime; 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryUptimeStart; 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryPastRealtime; 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTrackBatteryRealtimeStart; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryUptime; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedBatteryRealtime; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project /* 145105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project * These keep track of battery levels (1-100) at the last plug event and the last unplug event. 146105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project */ 147633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeStartLevel; 148633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar int mDischargeCurrentLevel; 149244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastWriteTime = 0; // Milliseconds 151244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 152c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 153c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Holds a SamplingTimer associated with each kernel wakelock name being tracked. 154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 155c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final HashMap<String, SamplingTimer> mKernelWakelockStats = 156c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, SamplingTimer>(); 157c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 158c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public Map<String, ? extends SamplingTimer> getKernelWakelockStats() { 159c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mKernelWakelockStats; 160c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 161c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 162c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static int sKernelWakelockUpdateVersion = 0; 163c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 164c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private static final int[] PROC_WAKELOCKS_FORMAT = new int[] { 165c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_STRING, // 0: name 166c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 1: count 167c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 168c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 169c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM, 170c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.PROC_TAB_TERM|Process.PROC_OUT_LONG, // 5: totalTime 171c64edde69d18498fb2954f71a546357b07ab996aEvan Millar }; 172c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 173c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final String[] mProcWakelocksName = new String[3]; 174c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final long[] mProcWakelocksData = new long[3]; 175c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 177c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Used as a buffer for reading in data from /proc/wakelocks before it is processed and added 178c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * to mKernelWakelockStats. 179c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 180c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> mProcWakelockFileStats = 181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar new HashMap<String, KernelWakelockStats>(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For debugging 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl() { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile = mBackupFile = null; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static interface Unpluggable { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void unplug(long batteryUptime, long batteryRealtime); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void plug(long batteryUptime, long batteryRealtime); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 194617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * State for keeping track of counting information. 195617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 196617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static final class Counter extends BatteryStats.Counter implements Unpluggable { 197617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mCount; 198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLoadedCount; 199617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mLastCount; 200617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mUnpluggedCount; 201617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int mPluggedCount; 202617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 203617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables, Parcel in) { 204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mPluggedCount = mCount = in.readInt(); 205617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLoadedCount = in.readInt(); 206617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLastCount = in.readInt(); 207617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = in.readInt(); 208617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 209617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 210617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 211617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter(ArrayList<Unpluggable> unpluggables) { 212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn unpluggables.add(this); 213617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 214617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 215617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void writeToParcel(Parcel out) { 216617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mCount); 217617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLoadedCount); 218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mLastCount); 219617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mUnpluggedCount); 220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 222617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void unplug(long batteryUptime, long batteryRealtime) { 223617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = mCount = mPluggedCount; 224617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 225617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 226617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void plug(long batteryUptime, long batteryRealtime) { 227617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mPluggedCount = mCount; 228617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 229617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 230617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 231617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * Writes a possibly null Counter to a Parcel. 232617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * 233617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param out the Parcel to be written to. 234617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn * @param counter a Counter, or null. 235617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn */ 236617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public static void writeCounterToParcel(Parcel out, Counter counter) { 237617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (counter == null) { 238617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); // indicates null 239617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return; 240617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 241617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); // indicates non-null 242617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 243617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn counter.writeToParcel(out); 244617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 245617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 246617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 247c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 248617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int val; 249617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_LAST) { 250617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val = mLastCount; 251617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 252617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val = mCount; 253617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (which == STATS_UNPLUGGED) { 254617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mUnpluggedCount; 255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else if (which != STATS_TOTAL) { 256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn val -= mLoadedCount; 257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return val; 261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 262617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 263617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void logState(Printer pw, String prefix) { 264617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn pw.println(prefix + "mCount=" + mCount 265617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 266617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mUnpluggedCount=" + mUnpluggedCount 267617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn + " mPluggedCount=" + mPluggedCount); 268617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 269617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void stepLocked() { 271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mCount++; 272617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void writeSummaryFromParcelLocked(Parcel out) { 275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mCount); 276617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(mCount - mLoadedCount); 277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 278617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 279617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void readSummaryFromParcelLocked(Parcel in) { 280617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mCount = mLoadedCount = in.readInt(); 281617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mLastCount = in.readInt(); 282617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUnpluggedCount = mPluggedCount = mCount; 283617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 284617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 285617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 286617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn /** 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * State for keeping track of timing information. 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 289c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static abstract class Timer extends BatteryStats.Timer implements Unpluggable { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mType; 291c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mCount; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedCount; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastCount; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedCount; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Times are in microseconds for better accuracy when dividing by the 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // lock count, and are in "battery realtime" units. 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we have accumulated since the start of the original 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * boot, to the last time something interesting happened in the 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current run. 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTotalTime; 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The total time we loaded for the previous runs. Subtract this from 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * mTotalTime to find the time for the current run of the system. 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTime; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The run time of the last run of the system, as loaded from the 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * saved data. 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastTime; 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The value of mTotalTime when unplug() was last called. Subtract 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this from mTotalTime to find the time since the last unplug from 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * power. 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedTime; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 327244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani /** 328244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * Constructs from a parcel. 329244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param type 330244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param unpluggables 331244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param powerType 332244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani * @param in 333244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani */ 334c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables, Parcel in) { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 336c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount = in.readInt(); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedCount = in.readInt(); 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastCount = in.readInt(); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = in.readInt(); 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = in.readLong(); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTime = in.readLong(); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastTime = in.readLong(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = in.readLong(); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 348c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer(int type, ArrayList<Unpluggable> unpluggables) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mType = type; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project unpluggables.add(this); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 352c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 353c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract long computeRunTimeLocked(long curBatteryRealtime); 354c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 355c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected abstract int computeCurrentCountLocked(); 356c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, long batteryRealtime) { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mCount); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedCount); 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastCount); 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedCount); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRunTimeLocked(batteryRealtime)); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTime); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastTime); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedTime); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType + ": realtime=" + batteryRealtime 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedTime=" + mUnpluggedTime 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " old mUnpluggedCount=" + mUnpluggedCount); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedTime = computeRunTimeLocked(batteryRealtime); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedCount = mCount; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "unplug #" + mType 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": new mUnpluggedTime=" + mUnpluggedTime 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " new mUnpluggedCount=" + mUnpluggedCount); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 385c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 386c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType + ": realtime=" + batteryRealtime 387c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " old mTotalTime=" + mTotalTime); 388c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 389c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = computeRunTimeLocked(batteryRealtime); 390c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = computeCurrentCountLocked(); 391c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 392c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "plug #" + mType 393c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + ": new mTotalTime=" + mTotalTime); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a possibly null Timer to a Parcel. 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param timer a Timer, or null. 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static void writeTimerToParcel(Parcel out, Timer timer, 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long batteryRealtime) { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timer == null) { 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); // indicates null 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); // indicates non-null 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project timer.writeToParcel(out, batteryRealtime); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 415c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long getTotalTimeLocked(long batteryRealtime, int which) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastTime; 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = computeRunTimeLocked(batteryRealtime); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedTime; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which != STATS_TOTAL) { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedTime; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 432c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getCountLocked(int which) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastCount; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 437c64edde69d18498fb2954f71a546357b07ab996aEvan Millar val = computeCurrentCountLocked(); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedCount; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which != STATS_TOTAL) { 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedCount; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 448627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void logState(Printer pw, String prefix) { 449c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + " mCount=" + mCount 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedCount=" + mUnpluggedCount); 452627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mTotalTime=" + mTotalTime 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mLoadedTime=" + mLoadedTime); 454627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn pw.println(prefix + "mLastTime=" + mLastTime 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mUnpluggedTime=" + mUnpluggedTime); 456c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 458c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 459c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 460c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long runTime = computeRunTimeLocked(batteryRealtime); 461c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Divide by 1000 for backwards compatibility 462c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong((runTime + 500) / 1000); 463c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(((runTime - mLoadedTime) + 500) / 1000); 464c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount); 465c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCount - mLoadedCount); 466c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 467c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 468c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 469c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Multiply by 1000 for backwards compatibility 470c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = mLoadedTime = in.readLong() * 1000; 471c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mLastTime = in.readLong() * 1000; 472c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedTime = mTotalTime; 473c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = mLoadedCount = in.readInt(); 474c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mLastCount = in.readInt(); 475c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedCount = mCount; 476c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 477c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 478c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 479c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class SamplingTimer extends Timer { 480c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 481c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 482c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported count from /proc/wakelocks. 483c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 484c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mCurrentReportedCount; 485c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 486c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 487c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported count from /proc/wakelocks when unplug() was last 488c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 489c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 490c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUnpluggedReportedCount; 491c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 492c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 493c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The most recent reported total_time from /proc/wakelocks. 494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 495c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mCurrentReportedTotalTime; 496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 497c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 498c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 499c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The reported total_time from /proc/wakelocks when unplug() was last 500c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * called. 501c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 502c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUnpluggedReportedTotalTime; 503c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 504c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 505c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently in a discharge cycle. 506c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 507c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mInDischarge; 508c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 509c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 510c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Whether we are currently recording reported values. 511c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 512c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean mTrackingReportedValues; 513c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 514c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 515c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * A sequnce counter, incremented once for each update of the stats. 516c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 517c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mUpdateVersion; 518c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 519c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, Parcel in) { 520c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables, in); 521c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = in.readInt(); 522c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = in.readInt(); 523c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = in.readLong(); 524c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = in.readLong(); 525c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 529c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer(ArrayList<Unpluggable> unpluggables, boolean inDischarge, 530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar boolean trackReportedValues) { 531c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(0, unpluggables); 532c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = trackReportedValues; 533c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = inDischarge; 534c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 535c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setStale() { 537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = false; 538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = 0; 539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = 0; 540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void setUpdateVersion(int version) { 543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateVersion = version; 544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int getUpdateVersion() { 547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUpdateVersion; 548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedCount(int count) { 551c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedCount == 0) { 552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 553c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = count; 554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 556c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedCount = count; 558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateCurrentReportedTotalTime(long totalTime) { 561c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mInDischarge && mUnpluggedReportedTotalTime == 0) { 562c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Updating the reported value for the first time. 563c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = totalTime; 564c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // If we are receiving an update update mTrackingReportedValues; 565c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = true; 566c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 567c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCurrentReportedTotalTime = totalTime; 568c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 569c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 570c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void unplug(long batteryUptime, long batteryRealtime) { 571c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.unplug(batteryUptime, batteryRealtime); 572c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mTrackingReportedValues) { 573c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime; 574c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount; 575c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 576c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = true; 577c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 578c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 579c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 580c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 581c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mInDischarge = false; 582c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 583c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 584c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 585c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 586c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount 587c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedCount=" + mUnpluggedReportedCount 588c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime 589c64edde69d18498fb2954f71a546357b07ab996aEvan Millar + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime); 590c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 591c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 592c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 593c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mTotalTime + (mInDischarge && mTrackingReportedValues 594c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0); 595c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 596c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 597c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 598c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount + (mInDischarge && mTrackingReportedValues 599c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ? mCurrentReportedCount - mUnpluggedReportedCount : 0); 600c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 601c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 602c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 603c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 604c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 605c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mUnpluggedReportedCount); 606c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 607c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUnpluggedReportedTotalTime); 608c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 609c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 610c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 611c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) { 612c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeSummaryFromParcelLocked(out, batteryRealtime); 613c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mCurrentReportedTotalTime); 614c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mCurrentReportedCount); 615c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mTrackingReportedValues ? 1 : 0); 616c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 617c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 618c64edde69d18498fb2954f71a546357b07ab996aEvan Millar void readSummaryFromParcelLocked(Parcel in) { 619c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 620c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong(); 621c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUnpluggedReportedCount = mCurrentReportedCount = in.readInt(); 622c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTrackingReportedValues = in.readInt() == 1; 623c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 624c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 625c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 626c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 627c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * State for keeping track of timing information. 628c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 629c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public static final class StopwatchTimer extends Timer { 630c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> mTimerPool; 631c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int mNesting; 632c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 633c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 634c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 635c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The last time at which we updated the timer. If mNesting is > 0, 636c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * subtract this from the current battery time to find the amount of 637c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * time we have been running since we last computed an update. 638c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 639c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mUpdateTime; 640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 641c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /** 642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * The total time at which the timer was acquired, to determine if 643c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * was actually held for an interesting duration. 644c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 645c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long mAcquireTime; 646c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 647c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool, 648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables, Parcel in) { 649c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables, in); 650c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 651c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = in.readLong(); 652c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 653c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 654c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer(int type, ArrayList<StopwatchTimer> timerPool, 655c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<Unpluggable> unpluggables) { 656c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super(type, unpluggables); 657c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTimerPool = timerPool; 658c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 659c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 660c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void writeToParcel(Parcel out, long batteryRealtime) { 661c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.writeToParcel(out, batteryRealtime); 662c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeLong(mUpdateTime); 663c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 664c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 665c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void plug(long batteryUptime, long batteryRealtime) { 666c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (mNesting > 0) { 667c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 668c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "old mUpdateTime=" + mUpdateTime); 669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 670c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.plug(batteryUptime, batteryRealtime); 671c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mUpdateTime = batteryRealtime; 672c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (DEBUG && mType < 0) { 673c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Log.v(TAG, "new mUpdateTime=" + mUpdateTime); 674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 675c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 676c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 677c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 678c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void logState(Printer pw, String prefix) { 679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.logState(pw, prefix); 680c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pw.println(prefix + "mNesting=" + mNesting + "mUpdateTime=" + mUpdateTime 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void startRunningLocked(BatteryStatsImpl stats) { 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting++ == 0) { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUpdateTime = stats.getBatteryRealtimeLocked( 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SystemClock.elapsedRealtime() * 1000); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all currently active timers before adding 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // this new one to the pool. 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Add this timer to the active pool 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.add(this); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Increment the count 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount++; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAcquireTime = mTotalTime; 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void stopRunningLocked(BatteryStatsImpl stats) { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ignore attempt to stop a timer that isn't running 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mNesting == 0) { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (--mNesting == 0) { 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTimerPool != null) { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Accumulate time to all active counters, scaled by the total 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // active in the pool, before taking this one out of the pool. 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project refreshTimersLocked(stats, mTimerPool); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Remove this timer from the active pool 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPool.remove(this); 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long realtime = SystemClock.elapsedRealtime() * 1000; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 1; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTotalTime = computeRunTimeLocked(batteryRealtime); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG && mType < 0) { 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mTotalTime=" + mTotalTime + " mCount=" + mCount 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " mAcquireTime=" + mAcquireTime); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mTotalTime == mAcquireTime) { 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If there was no change in the time, then discard this 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // count. A somewhat cheezy strategy, but hey. 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCount--; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Update the total time for all other running Timers with the same type as this Timer 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // due to a change in timer count 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static void refreshTimersLocked(final BatteryStatsImpl stats, 743c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final ArrayList<StopwatchTimer> pool) { 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long realtime = SystemClock.elapsedRealtime() * 1000; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = stats.getBatteryRealtimeLocked(realtime); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = pool.size(); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=N-1; i>= 0; i--) { 748c64edde69d18498fb2954f71a546357b07ab996aEvan Millar final StopwatchTimer t = pool.get(i); 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long heldTime = batteryRealtime - t.mUpdateTime; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (heldTime > 0) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mTotalTime += heldTime / N; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.mUpdateTime = batteryRealtime; 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 757c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 758c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected long computeRunTimeLocked(long curBatteryRealtime) { 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTotalTime + (mNesting > 0 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (curBatteryRealtime - mUpdateTime) 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project / (mTimerPool != null ? mTimerPool.size() : 1) 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : 0); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 765c64edde69d18498fb2954f71a546357b07ab996aEvan Millar @Override 766c64edde69d18498fb2954f71a546357b07ab996aEvan Millar protected int computeCurrentCountLocked() { 767c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mCount; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readSummaryFromParcelLocked(Parcel in) { 771c64edde69d18498fb2954f71a546357b07ab996aEvan Millar super.readSummaryFromParcelLocked(in); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNesting = 0; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 776c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> readKernelWakelockStats() { 777c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 778c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] buffer = new byte[4096]; 779c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int len; 780c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 781c64edde69d18498fb2954f71a546357b07ab996aEvan Millar try { 782c64edde69d18498fb2954f71a546357b07ab996aEvan Millar FileInputStream is = new FileInputStream("/proc/wakelocks"); 783c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = is.read(buffer); 784c64edde69d18498fb2954f71a546357b07ab996aEvan Millar is.close(); 785c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 786c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (len > 0) { 787c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 788c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i=0; i<len; i++) { 789c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (buffer[i] == '\0') { 790c64edde69d18498fb2954f71a546357b07ab996aEvan Millar len = i; 791c64edde69d18498fb2954f71a546357b07ab996aEvan Millar break; 792c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 793c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 794c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 795c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.FileNotFoundException e) { 796c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 797c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } catch (java.io.IOException e) { 798c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return null; 799c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 800c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 801c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return parseProcWakelocks(buffer, len); 802c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 803c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 804c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private final Map<String, KernelWakelockStats> parseProcWakelocks( 805c64edde69d18498fb2954f71a546357b07ab996aEvan Millar byte[] wlBuffer, int len) { 806c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name; 807c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int count; 808c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long totalTime; 809c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int startIndex, endIndex; 810c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int numUpdatedWlNames = 0; 811c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 812c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Advance past the first line. 813c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int i; 814c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (i = 0; i < len && wlBuffer[i] != '\n' && wlBuffer[i] != '\0'; i++); 815c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex = i + 1; 816c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 817c64edde69d18498fb2954f71a546357b07ab996aEvan Millar synchronized(this) { 818c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = mProcWakelockFileStats; 819c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 820c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion++; 821c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (endIndex < len) { 822c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (endIndex=startIndex; 823c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex < len && wlBuffer[endIndex] != '\n' && wlBuffer[endIndex] != '\0'; 824c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex++); 825c64edde69d18498fb2954f71a546357b07ab996aEvan Millar endIndex++; // endIndex is an exclusive upper bound. 826c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 827c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String[] nameStringArray = mProcWakelocksName; 828c64edde69d18498fb2954f71a546357b07ab996aEvan Millar long[] wlData = mProcWakelocksData; 829c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Process.parseProcLine(wlBuffer, startIndex, endIndex, PROC_WAKELOCKS_FORMAT, 830c64edde69d18498fb2954f71a546357b07ab996aEvan Millar nameStringArray, wlData, null); 831c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 832c64edde69d18498fb2954f71a546357b07ab996aEvan Millar name = nameStringArray[0]; 833c64edde69d18498fb2954f71a546357b07ab996aEvan Millar count = (int) wlData[1]; 834c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // convert nanoseconds to microseconds with rounding. 835c64edde69d18498fb2954f71a546357b07ab996aEvan Millar totalTime = (wlData[2] + 500) / 1000; 836c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 837c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (name.length() > 0) { 838c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (!m.containsKey(name)) { 839c64edde69d18498fb2954f71a546357b07ab996aEvan Millar m.put(name, new KernelWakelockStats(count, totalTime, 840c64edde69d18498fb2954f71a546357b07ab996aEvan Millar sKernelWakelockUpdateVersion)); 841c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 842c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 843c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kwlStats = m.get(name); 844c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlStats.mVersion == sKernelWakelockUpdateVersion) { 845c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount += count; 846c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime += totalTime; 847c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 848c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mCount = count; 849c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mTotalTime = totalTime; 850c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlStats.mVersion = sKernelWakelockUpdateVersion; 851c64edde69d18498fb2954f71a546357b07ab996aEvan Millar numUpdatedWlNames++; 852c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 853c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 854c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 855c64edde69d18498fb2954f71a546357b07ab996aEvan Millar startIndex = endIndex; 856c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 857c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 858c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != numUpdatedWlNames) { 859c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Don't report old data. 860c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Iterator<KernelWakelockStats> itr = m.values().iterator(); 861c64edde69d18498fb2954f71a546357b07ab996aEvan Millar while (itr.hasNext()) { 862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (itr.next().mVersion != sKernelWakelockUpdateVersion) { 863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar itr.remove(); 864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 867c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return m; 868c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 869c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 870c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 871c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private class KernelWakelockStats { 872c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mCount; 873c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public long mTotalTime; 874c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public int mVersion; 875c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 876c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats(int count, long totalTime, int version) { 877c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mCount = count; 878c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mTotalTime = totalTime; 879c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mVersion = version; 880c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 881c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 882c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 883c64edde69d18498fb2954f71a546357b07ab996aEvan Millar /* 884c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * Get the KernelWakelockTimer associated with name, and create a new one if one 885c64edde69d18498fb2954f71a546357b07ab996aEvan Millar * doesn't already exist. 886c64edde69d18498fb2954f71a546357b07ab996aEvan Millar */ 887c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public SamplingTimer getKernelWakelockTimerLocked(String name) { 888c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 889c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 890c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 891c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 892c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 893c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 894c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return kwlt; 895c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 896c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void doUnplug(long batteryUptime, long batteryRealtime) { 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesReceived = NetStat.getUidRxBytes(u.mUid); 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesSent = NetStat.getUidTxBytes(u.mUid); 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived; 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime); 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void doPlug(long batteryUptime, long batteryRealtime) { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = mUidStats.size() - 1; iu >= 0; iu--) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesReceived >= 0) { 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesReceived = u.computeCurrentTcpBytesReceived(); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesReceived = -1; 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u.mStartedTcpBytesSent >= 0) { 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mCurrentTcpBytesSent = u.computeCurrentTcpBytesSent(); 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mStartedTcpBytesSent = -1; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = mUnpluggables.size() - 1; i >= 0; i--) { 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.get(i).plug(batteryUptime, batteryRealtime); 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.get(uid).noteStartGps(); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.get(uid).noteStopGps(); 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOnLocked() { 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mScreenOn) { 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = true; 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.startRunningLocked(this); 939617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 940617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(this); 941617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOffLocked() { 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mScreenOn) { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.stopRunningLocked(this); 949617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 950617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 951617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 952617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 953617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 954617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 955617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightnessLocked(int brightness) { 956617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn // Bin the brightness. 957617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS); 958617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (bin < 0) bin = 0; 959617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1; 960617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin != bin) { 961617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenOn) { 962617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mScreenBrightnessBin >= 0) { 963617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(this); 964617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 965617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[bin].startRunningLocked(this); 966617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 967617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessBin = bin; 968617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 969617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 970617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 971617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteInputEventLocked() { 972617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.stepLocked(); 973617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 974617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 975617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int uid, int event) { 976617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Uid u = mUidStats.get(uid); 977617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u != null) { 978617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.noteUserActivityLocked(event); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOnLocked() { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mPhoneOn) { 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = true; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.startRunningLocked(this); 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOffLocked() { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mPhoneOn) { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.stopRunningLocked(this); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 996e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) { 997627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn // Bin the strength. 998627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin; 999e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville 1000e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (!signalStrength.isGsm()) { 1001e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int dBm = signalStrength.getCdmaDbm(); 1002e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (dBm >= -75) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1003e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (dBm >= -85) bin = SIGNAL_STRENGTH_GREAT; 1004e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (dBm >= -95) bin = SIGNAL_STRENGTH_GOOD; 1005e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (dBm >= -100) bin = SIGNAL_STRENGTH_MODERATE; 1006e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else bin = SIGNAL_STRENGTH_POOR; 1007e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } else { 1008e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville int asu = signalStrength.getGsmSignalStrength(); 1009e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville if (asu < 0 || asu >= 99) bin = SIGNAL_STRENGTH_NONE_OR_UNKNOWN; 1010e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 16) bin = SIGNAL_STRENGTH_GREAT; 1011e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 8) bin = SIGNAL_STRENGTH_GOOD; 1012e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else if (asu >= 4) bin = SIGNAL_STRENGTH_MODERATE; 1013e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville else bin = SIGNAL_STRENGTH_POOR; 1014e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville } 1015627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneSignalStrengthBin != bin) { 1016627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneSignalStrengthBin >= 0) { 1017627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(this); 1018627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1019627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthBin = bin; 1020627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[bin].startRunningLocked(this); 1021627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1022627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1023627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1024627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) { 1025627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn int bin = DATA_CONNECTION_NONE; 1026627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (hasData) { 1027627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn switch (dataType) { 1028627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_EDGE: 1029627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_EDGE; 1030627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1031627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_GPRS: 1032627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_GPRS; 1033627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1034627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn case TelephonyManager.NETWORK_TYPE_UMTS: 1035627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_UMTS; 1036627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1037627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn default: 1038627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn bin = DATA_CONNECTION_OTHER; 1039627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn break; 1040627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1041627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1042627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType != bin) { 1043627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn if (mPhoneDataConnectionType >= 0) { 1044627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(this); 1045627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1046627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionType = bin; 1047627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[bin].startRunningLocked(this); 1048627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1049627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1050627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1051617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiOnLocked(int uid) { 1052105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mWifiOn) { 1053105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = true; 1054105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.startRunningLocked(this); 1055105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1056617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid != uid) { 1057617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 1058617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Uid u = mUidStats.get(mWifiOnUid); 1059617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u != null) { 1060617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.noteWifiTurnedOffLocked(); 1061617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1062617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1063617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = uid; 1064617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Uid u = mUidStats.get(uid); 1065617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u != null) { 1066617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.noteWifiTurnedOnLocked(); 1067617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1068617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1069105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1070105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1071617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiOffLocked(int uid) { 1072105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mWifiOn) { 1073105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 1074105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.stopRunningLocked(this); 1075105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1076617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiOnUid >= 0) { 1077617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Uid u = mUidStats.get(mWifiOnUid); 1078617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u != null) { 1079617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.noteWifiTurnedOffLocked(); 1080617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1081617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiOnUid = -1; 1082617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1083105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1084244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1085244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOnLocked(int uid) { 1086244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioOn) { 1087244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = true; 1088244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.startRunningLocked(this); 1089244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1090244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani Uid u = mUidStats.get(uid); 1091244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (u != null) { 1092244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.noteAudioTurnedOnLocked(); 1093244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1094244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1095105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1096244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioOffLocked(int uid) { 1097244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioOn) { 1098244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOn = false; 1099244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioOnTimer.stopRunningLocked(this); 1100244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1101244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani Uid u = mUidStats.get(uid); 1102244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (u != null) { 1103244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.noteAudioTurnedOffLocked(); 1104244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1105244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1106244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1107244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOnLocked(int uid) { 1108244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoOn) { 1109244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = true; 1110244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.startRunningLocked(this); 1111244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1112244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani Uid u = mUidStats.get(uid); 1113244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (u != null) { 1114244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.noteVideoTurnedOnLocked(); 1115244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1116244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1117244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1118244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoOffLocked(int uid) { 1119244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoOn) { 1120244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOn = false; 1121244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoOnTimer.stopRunningLocked(this); 1122244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1123244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani Uid u = mUidStats.get(uid); 1124244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (u != null) { 1125244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.noteVideoTurnedOffLocked(); 1126244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1127244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1128244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1129d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public void noteWifiRunningLocked() { 1130d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood if (!mWifiRunning) { 1131d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = true; 1132d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.startRunningLocked(this); 1133d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1134d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1135d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1136d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public void noteWifiStoppedLocked() { 1137d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood if (mWifiRunning) { 1138d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 1139d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.stopRunningLocked(this); 1140d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1141d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1142d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1143105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOnLocked() { 1144105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mBluetoothOn) { 1145105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = true; 1146105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.startRunningLocked(this); 1147105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1148105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1149105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1150105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOffLocked() { 1151105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mBluetoothOn) { 1152105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 1153105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.stopRunningLocked(this); 1154105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1155105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1156105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1157105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked(int uid) { 1158105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Uid u = mUidStats.get(uid); 1159105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (u != null) { 1160105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.noteFullWifiLockAcquiredLocked(); 1161105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1162105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1163105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1164105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked(int uid) { 1165105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Uid u = mUidStats.get(uid); 1166105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (u != null) { 1167105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.noteFullWifiLockReleasedLocked(); 1168105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1169105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1170105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1171105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked(int uid) { 1172105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Uid u = mUidStats.get(uid); 1173105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (u != null) { 1174105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.noteScanWifiLockAcquiredLocked(); 1175105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1176105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1177105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1178105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked(int uid) { 1179105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project Uid u = mUidStats.get(uid); 1180105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (u != null) { 1181105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.noteScanWifiLockReleasedLocked(); 1182105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1183105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 11845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 11855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked(int uid) { 11865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt Uid u = mUidStats.get(uid); 11875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (u != null) { 11885347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.noteWifiMulticastEnabledLocked(); 11895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 11905347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 11915347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 11925347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked(int uid) { 11935347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt Uid u = mUidStats.get(uid); 11945347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (u != null) { 11955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.noteWifiMulticastDisabledLocked(); 11965347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 11975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 11985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getScreenOnTime(long batteryRealtime, int which) { 1200c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenOnTimer.getTotalTimeLocked(batteryRealtime, which); 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1203617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public long getScreenBrightnessTime(int brightnessBin, 1204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn long batteryRealtime, int which) { 1205c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked( 1206617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn batteryRealtime, which); 1207617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1208244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1209617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getInputEventCount(int which) { 1210c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mInputEventCounter.getCountLocked(which); 1211617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1212617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public long getPhoneOnTime(long batteryRealtime, int which) { 1214c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneOnTimer.getTotalTimeLocked(batteryRealtime, which); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1216244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1217627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneSignalStrengthTime(int strengthBin, 1218627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 1219c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked( 1220627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 1221627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1222627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1223617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneSignalStrengthCount(int dataType, int which) { 1224c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 1225617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1226617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1227627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn @Override public long getPhoneDataConnectionTime(int dataType, 1228627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn long batteryRealtime, int which) { 1229c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked( 1230627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn batteryRealtime, which); 1231627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 1232627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 1233617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override public int getPhoneDataConnectionCount(int dataType, int which) { 1234c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mPhoneDataConnectionsTimer[dataType].getCountLocked(which); 1235617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1236617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1237105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getWifiOnTime(long batteryRealtime, int which) { 1238c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiOnTimer.getTotalTimeLocked(batteryRealtime, which); 1239105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1240105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1241d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood @Override public long getWifiRunningTime(long batteryRealtime, int which) { 1242c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiRunningTimer.getTotalTimeLocked(batteryRealtime, which); 1243d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 1244d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 1245105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override public long getBluetoothOnTime(long batteryRealtime, int which) { 1246c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mBluetoothOnTimer.getTotalTimeLocked(batteryRealtime, which); 1247105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1248105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public boolean getIsOnBattery() { 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() { 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUidStats; 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular uid. 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Uid extends BatteryStats.Uid { 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mUid; 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesReceived; 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedTcpBytesSent; 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesReceived; 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mCurrentTcpBytesSent; 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesReceivedAtLastUnplug; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mTcpBytesSentAtLastUnplug; 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // These are not saved/restored when parcelling, since we want 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to return from the parcel with a snapshot of the state. 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesReceived = -1; 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartedTcpBytesSent = -1; 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1275617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn boolean mWifiTurnedOn; 1276c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mWifiTurnedOnTimer; 1277617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1278105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mFullWifiLockOut; 1279c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mFullWifiLockTimer; 1280105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1281105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project boolean mScanWifiLockOut; 1282c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mScanWifiLockTimer; 1283244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 12845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt boolean mWifiMulticastEnabled; 12855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt StopwatchTimer mWifiMulticastTimer; 1286244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1287244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mAudioTurnedOn; 1288244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mAudioTurnedOnTimer; 1289244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1290244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani boolean mVideoTurnedOn; 1291244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani StopwatchTimer mVideoTurnedOnTimer; 12925347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 1293617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn Counter[] mUserActivityCounters; 1294617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's wake locks. 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Wakelock> mWakelockStats = new HashMap<String, Wakelock>(); 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's sensor activations. 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<Integer, Sensor> mSensorStats = new HashMap<Integer, Sensor>(); 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Proc> mProcessStats = new HashMap<String, Proc>(); 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics we have collected for this uid's processes. 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Pkg> mPackageStats = new HashMap<String, Pkg>(); 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid(int uid) { 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUid = uid; 1317c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables); 1318c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables); 1319c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables); 13205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED, 13215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt null, mUnpluggables); 1322244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables); 1323244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables); 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() { 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mWakelockStats; 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<Integer, ? extends BatteryStats.Uid.Sensor> getSensorStats() { 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSensorStats; 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Proc> getProcessStats() { 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mProcessStats; 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mPackageStats; 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getUid() { 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mUid; 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesReceived(int which) { 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesReceived; 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesReceived(); 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesReceivedAtLastUnplug; 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_TOTAL) { 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesReceived; 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesReceived() { 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (NetStat.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0); 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getTcpBytesSent(int which) { 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLoadedTcpBytesSent; 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long current = computeCurrentTcpBytesSent(); 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_UNPLUGGED) { 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current -= mTcpBytesSentAtLastUnplug; 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_TOTAL) { 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project current += mLoadedTcpBytesSent; 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return current; 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1383105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1384617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiTurnedOnLocked() { 1385617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (!mWifiTurnedOn) { 1386617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOn = true; 1387617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 1388617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1389617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1390617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1391617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1392617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiTurnedOffLocked() { 1393617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mWifiTurnedOn) { 1394617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOn = false; 1395617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 1396617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1397617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1398617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1399617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1400105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquiredLocked() { 1401105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mFullWifiLockOut) { 1402105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = true; 1403105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 1404105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1405105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1406105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1407105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1408244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoTurnedOnLocked() { 1409244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mVideoTurnedOn) { 1410244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOn = true; 1411244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 1412244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1413244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1414244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1415244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1416244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteVideoTurnedOffLocked() { 1417244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mVideoTurnedOn) { 1418244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOn = false; 1419244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 1420244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1421244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1422244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1423244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1424244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioTurnedOnLocked() { 1425244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (!mAudioTurnedOn) { 1426244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOn = true; 1427244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer.startRunningLocked(BatteryStatsImpl.this); 1428244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1429244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1430244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1431244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1432244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteAudioTurnedOffLocked() { 1433244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani if (mAudioTurnedOn) { 1434244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOn = false; 1435244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer.stopRunningLocked(BatteryStatsImpl.this); 1436244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1437244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1438244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1439244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1440105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleasedLocked() { 1441105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mFullWifiLockOut) { 1442105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 1443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 1444105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1445105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1446105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1448105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquiredLocked() { 1449105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (!mScanWifiLockOut) { 1450105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = true; 1451105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.startRunningLocked(BatteryStatsImpl.this); 1452105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1453105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1454105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1455105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1456105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleasedLocked() { 1457105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project if (mScanWifiLockOut) { 1458105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 1459105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.stopRunningLocked(BatteryStatsImpl.this); 1460105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1461105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 14625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 14635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 14645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabledLocked() { 14655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (!mWifiMulticastEnabled) { 14665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = true; 14675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.startRunningLocked(BatteryStatsImpl.this); 14685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 14695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 14705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 14715347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 14725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabledLocked() { 14735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt if (mWifiMulticastEnabled) { 14745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 14755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.stopRunningLocked(BatteryStatsImpl.this); 14765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 14775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 14785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 1479617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1480617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public long getWifiTurnedOnTime(long batteryRealtime, int which) { 1481c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mWifiTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 1482617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1483244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1484244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1485244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public long getAudioTurnedOnTime(long batteryRealtime, int which) { 1486244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani return mAudioTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 1487244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1488244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1489244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani @Override 1490244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public long getVideoTurnedOnTime(long batteryRealtime, int which) { 1491244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani return mVideoTurnedOnTimer.getTotalTimeLocked(batteryRealtime, which); 1492244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 1493244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 1494105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1495105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getFullWifiLockTime(long batteryRealtime, int which) { 1496c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mFullWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 1497105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 1498105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 1499105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 1500105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public long getScanWifiLockTime(long batteryRealtime, int which) { 1501c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mScanWifiLockTimer.getTotalTimeLocked(batteryRealtime, which); 1502105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 15035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 15045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt @Override 15055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public long getWifiMulticastTime(long batteryRealtime, int which) { 15065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt return mWifiMulticastTimer.getTotalTimeLocked(batteryRealtime, 15075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt which); 15085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 15095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 1510617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1511617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivityLocked(int type) { 1512617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 1513617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn initUserActivityLocked(); 1514617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1515617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (type < 0) type = 0; 1516617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn else if (type >= NUM_USER_ACTIVITY_TYPES) type = NUM_USER_ACTIVITY_TYPES-1; 1517617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[type].stepLocked(); 1518617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1519617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1520617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1521617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public boolean hasUserActivity() { 1522617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return mUserActivityCounters != null; 1523617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1524617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1525617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn @Override 1526617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public int getUserActivityCount(int type, int which) { 1527617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 1528617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn return 0; 1529617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1530c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return mUserActivityCounters[type].getCountLocked(which); 1531617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1532617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1533617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn void initUserActivityLocked() { 1534617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 1535617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 1536617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables); 1537617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1538617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1539617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeCurrentTcpBytesSent() { 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? (NetStat.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0); 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1544244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakelockStats.size()); 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Wakelock> wakelockEntry : mWakelockStats.entrySet()) { 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(wakelockEntry.getKey()); 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = wakelockEntry.getValue(); 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.writeToParcelLocked(out, batteryRealtime); 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mSensorStats.size()); 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, Uid.Sensor> sensorEntry : mSensorStats.entrySet()) { 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(sensorEntry.getKey()); 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = sensorEntry.getValue(); 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.writeToParcelLocked(out, batteryRealtime); 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mProcessStats.size()); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Proc> procEntry : mProcessStats.entrySet()) { 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(procEntry.getKey()); 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = procEntry.getValue(); 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.writeToParcelLocked(out); 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mPackageStats.size()); 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) { 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(pkgEntry.getKey()); 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = pkgEntry.getValue(); 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.writeToParcelLocked(out); 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesReceived); 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedTcpBytesSent); 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesReceived()); 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeCurrentTcpBytesSent()); 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesReceivedAtLastUnplug); 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTcpBytesSentAtLastUnplug); 1580617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOnTimer.writeToParcel(out, batteryRealtime); 1581105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockTimer.writeToParcel(out, batteryRealtime); 1582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer.writeToParcel(out, batteryRealtime); 1583244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer.writeToParcel(out, batteryRealtime); 1584105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockTimer.writeToParcel(out, batteryRealtime); 15855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer.writeToParcel(out, batteryRealtime); 1586617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (mUserActivityCounters == null) { 1587617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 1588617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 1589617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 1590617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 1591617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i].writeToParcel(out); 1592617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1593617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numWakelocks = in.readInt(); 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.clear(); 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < numWakelocks; j++) { 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wakelockName = in.readString(); 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wakelock = new Wakelock(); 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wakelock.readFromParcelLocked(unpluggables, in); 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.put(wakelockName, wakelock); 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numSensors = in.readInt(); 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.clear(); 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numSensors; k++) { 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sensorNumber = in.readInt(); 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor sensor = new Sensor(sensorNumber); 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sensor.readFromParcelLocked(mUnpluggables, in); 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensorNumber, sensor); 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numProcs = in.readInt(); 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.clear(); 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < numProcs; k++) { 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String processName = in.readString(); 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc proc = new Proc(); 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project proc.readFromParcelLocked(in); 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(processName, proc); 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numPkgs = in.readInt(); 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.clear(); 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int l = 0; l < numPkgs; l++) { 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = in.readString(); 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg pkg = new Pkg(); 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.readFromParcelLocked(in); 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(packageName, pkg); 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesReceived = in.readLong(); 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedTcpBytesSent = in.readLong(); 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesReceived = in.readLong(); 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCurrentTcpBytesSent = in.readLong(); 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesReceivedAtLastUnplug = in.readLong(); 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTcpBytesSentAtLastUnplug = in.readLong(); 1639617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mWifiTurnedOn = false; 1640c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiTurnedOnTimer = new StopwatchTimer(WIFI_TURNED_ON, null, mUnpluggables, in); 1641105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mFullWifiLockOut = false; 1642c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mFullWifiLockTimer = new StopwatchTimer(FULL_WIFI_LOCK, null, mUnpluggables, in); 1643244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOn = false; 1644244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mAudioTurnedOnTimer = new StopwatchTimer(AUDIO_TURNED_ON, null, mUnpluggables, in); 1645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOn = false; 1646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mVideoTurnedOnTimer = new StopwatchTimer(VIDEO_TURNED_ON, null, mUnpluggables, in); 1647105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mScanWifiLockOut = false; 1648c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScanWifiLockTimer = new StopwatchTimer(SCAN_WIFI_LOCK, null, mUnpluggables, in); 16495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastEnabled = false; 16505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mWifiMulticastTimer = new StopwatchTimer(WIFI_MULTICAST_ENABLED, 16515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt null, mUnpluggables, in); 1652617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() == 0) { 1653617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = null; 1654617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 1655617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES]; 1656617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) { 1657617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mUserActivityCounters[i] = new Counter(mUnpluggables, in); 1658617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 1659617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular wake lock. 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Wakelock extends BatteryStats.Uid.Wakelock { 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device partially awake. 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1669c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerPartial; 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has been keeping the device fully awake. 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1674c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerFull; 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * How long (in ms) this uid has had a window keeping the device awake. 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1679c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimerWindow; 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Reads a possibly null Timer from a Parcel. The timer is associated with the 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * proper timer pool from the given BatteryStatsImpl object. 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param in the Parcel to be read from. 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * return a new Timer, or null. 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1688c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool, 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ArrayList<Unpluggable> unpluggables, Parcel in) { 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1694c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return new StopwatchTimer(type, pool, unpluggables, in); 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers, unpluggables, in); 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers, unpluggables, in); 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers, unpluggables, in); 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerPartial, batteryRealtime); 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerFull, batteryRealtime); 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimerWindow, batteryRealtime); 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getWakeTime(int type) { 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: return mTimerFull; 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: return mTimerPartial; 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: return mTimerWindow; 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: throw new IllegalArgumentException("type = " + type); 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Sensor extends BatteryStats.Uid.Sensor { 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int mHandle; 1725c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer mTimer; 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Sensor(int handle) { 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHandle = handle; 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1731c64edde69d18498fb2954f71a546357b07ab996aEvan Millar private StopwatchTimer readTimerFromParcel(ArrayList<Unpluggable> unpluggables, 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in) { 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() == 0) { 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1737c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle); 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pool == null) { 1739c64edde69d18498fb2954f71a546357b07ab996aEvan Millar pool = new ArrayList<StopwatchTimer>(); 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(mHandle, pool); 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1742c64edde69d18498fb2954f71a546357b07ab996aEvan Millar return new StopwatchTimer(0, pool, unpluggables, in); 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(ArrayList<Unpluggable> unpluggables, Parcel in) { 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTimer = readTimerFromParcel(unpluggables, in); 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, long batteryRealtime) { 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Timer.writeTimerToParcel(out, mTimer, batteryRealtime); 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Timer getSensorTime() { 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mTimer; 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getHandle() { 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mHandle; 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular process. 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Proc extends BatteryStats.Uid.Proc implements Unpluggable { 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in user code. 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUserTime; 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (in 1/100 sec) spent executing in kernel code. 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSystemTime; 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times the process has been started. 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from a previous save. 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedUserTime; 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from a previous save. 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedSystemTime; 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from a previous save. 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time loaded from the previous run. 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastUserTime; 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time loaded from the previous run. 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastSystemTime; 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started from the previous run. 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of user time when last unplugged. 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedUserTime; 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of system time when last unplugged. 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedSystemTime; 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of times the process has started before unplugged. 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc() { 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = mUserTime; 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = mSystemTime; 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 1841105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 1842105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 1843105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUserTime); 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mSystemTime); 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedUserTime); 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedSystemTime); 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastUserTime); 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastSystemTime); 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastStarts); 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedUserTime); 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedSystemTime); 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime = in.readLong(); 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime = in.readLong(); 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedUserTime = in.readLong(); 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedSystemTime = in.readLong(); 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUserTime = in.readLong(); 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastSystemTime = in.readLong(); 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastStarts = in.readInt(); 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedUserTime = in.readLong(); 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedSystemTime = in.readLong(); 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void addCpuTimeLocked(int utime, int stime) { 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUserTime += utime; 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSystemTime += stime; 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incStartsLocked() { 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getUserTime(int which) { 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastUserTime; 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mUserTime; 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedUserTime; 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedUserTime; 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSystemTime(int which) { 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastSystemTime; 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mSystemTime; 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedSystemTime; 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedSystemTime; 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular package. 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Pkg extends BatteryStats.Uid.Pkg implements Unpluggable { 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of times this package has done something that could wake up the 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * device from sleep. 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mWakeups; 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device loaded from a 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * previous save. 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedWakeups; 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastWakeups; 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Number of things that could wake up the device as of the 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * last run. 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedWakeups; 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statics we have collected for this package's services. 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final HashMap<String, Serv> mServiceStats = new HashMap<String, Serv>(); 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg() { 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = mWakeups; 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups = in.readInt(); 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedWakeups = in.readInt(); 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWakeups = in.readInt(); 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedWakeups = in.readInt(); 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numServs = in.readInt(); 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.clear(); 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int m = 0; m < numServs; m++) { 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String serviceName = in.readString(); 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = new Serv(); 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mServiceStats.put(serviceName, serv); 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.readFromParcelLocked(in); 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mWakeups); 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedWakeups); 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastWakeups); 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedWakeups); 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mServiceStats.size()); 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, Uid.Pkg.Serv> servEntry : mServiceStats.entrySet()) { 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(servEntry.getKey()); 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv serv = servEntry.getValue(); 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project serv.writeToParcelLocked(out); 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Map<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() { 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mServiceStats; 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getWakeups(int which) { 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastWakeups; 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mWakeups; 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedWakeups; 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedWakeups; 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The statistics associated with a particular service. 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final class Serv extends BatteryStats.Uid.Pkg.Serv implements Unpluggable { 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left started. 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mStartTime; 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been started and not yet stopped, this is 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was started. 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mRunningSince; 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently running. 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mRunning; 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number of times startService() has been called. 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mStarts; 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total time (ms in battery uptime) the service has been left launched. 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedTime; 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If service has been launched and not yet exited, this is 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when it was launched (ms in battery uptime). 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLaunchedSince; 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * True if we are currently launched. 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mLaunched; 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Total number times the service has been launched. 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLaunches; 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started loaded from a previous save 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (ms in battery uptime). 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLoadedStartTime; 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts loaded from a previous save. 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedStarts; 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches loaded from a previous save. 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLoadedLaunches; 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started as of the last run (ms 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mLastStartTime; 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts as of the last run. 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastStarts; 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches as of the last run. 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mLastLaunches; 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The amount of time spent started when last unplugged (ms 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in battery uptime). 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mUnpluggedStartTime; 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of starts when last unplugged. 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedStarts; 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The number of launches when last unplugged. 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int mUnpluggedLaunches; 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Serv() { 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggables.add(this); 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void unplug(long batteryUptime, long batteryRealtime) { 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = getStartTimeToNowLocked(batteryUptime); 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = mStarts; 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = mLaunches; 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void plug(long batteryUptime, long batteryRealtime) { 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime = in.readLong(); 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = in.readLong(); 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = in.readInt() != 0; 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts = in.readInt(); 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime = in.readLong(); 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = in.readLong(); 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = in.readInt() != 0; 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches = in.readInt(); 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStartTime = in.readLong(); 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedStarts = in.readInt(); 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLoadedLaunches = in.readInt(); 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastStartTime = in.readLong(); 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastStarts = in.readInt(); 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastLaunches = in.readInt(); 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStartTime = in.readLong(); 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedStarts = in.readInt(); 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedLaunches = in.readInt(); 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out) { 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mStartTime); 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRunningSince); 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mRunning ? 1 : 0); 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStarts); 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedTime); 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLaunchedSince); 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunched ? 1 : 0); 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLaunches); 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLoadedStartTime); 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedStarts); 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLoadedLaunches); 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastStartTime); 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastStarts); 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mLastLaunches); 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedStartTime); 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedStarts); 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUnpluggedLaunches); 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getLaunchTimeToNowLocked(long batteryUptime) { 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) return mLaunchedTime; 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLaunchedTime + batteryUptime - mLaunchedSince; 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getStartTimeToNowLocked(long batteryUptime) { 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) return mStartTime; 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartTime + batteryUptime - mRunningSince; 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startLaunchedLocked() { 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mLaunched) { 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches++; 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedSince = getBatteryUptimeLocked(); 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = true; 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopLaunchedLocked() { 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLaunched) { 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mLaunchedSince; 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunchedTime += time; 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunches--; 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLaunched = false; 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void startRunningLocked() { 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mRunning) { 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts++; 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunningSince = getBatteryUptimeLocked(); 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = true; 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void stopRunningLocked() { 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mRunning) { 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = getBatteryUptimeLocked() - mRunningSince; 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (time > 0) { 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartTime += time; 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStarts--; 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRunning = false; 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getLaunches(int which) { 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastLaunches; 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLaunches; 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedLaunches; 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedLaunches; 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getStartTime(long now, int which) { 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long val; 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStartTime; 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = getStartTimeToNowLocked(now); 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStartTime; 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStartTime; 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStarts(int which) { 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int val; 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_LAST) { 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mLastStarts; 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val = mStarts; 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (which == STATS_CURRENT) { 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mLoadedStarts; 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (which == STATS_UNPLUGGED) { 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val -= mUnpluggedStarts; 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return val; 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void incWakeupsLocked() { 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakeups++; 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Serv newServiceStatsLocked() { 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Serv(); 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Proc getProcessStatsLocked(String name) { 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Proc ps = mProcessStats.get(name); 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Proc(); 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mProcessStats.put(name, ps); 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg getPackageStatsLocked(String name) { 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = mPackageStats.get(name); 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ps == null) { 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps = new Pkg(); 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPackageStats.put(name, ps); 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ps; 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 23309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 23319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 23329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Pkg.Serv getServiceStatsLocked(String pkg, String serv) { 23339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg ps = getPackageStatsLocked(pkg); 23349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Pkg.Serv ss = ps.mServiceStats.get(serv); 23359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ss == null) { 23369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ss = ps.newServiceStatsLocked(); 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ps.mServiceStats.put(serv, ss); 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ss; 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2343c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getWakeTimerLocked(String name, int type) { 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Wakelock wl = mWakelockStats.get(name); 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl == null) { 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl = new Wakelock(); 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWakelockStats.put(name, wl); 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2349c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = null; 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (type) { 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_PARTIAL: 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerPartial; 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 2354c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(WAKE_TYPE_PARTIAL, mPartialTimers, mUnpluggables); 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial = t; 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_FULL: 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerFull; 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 2361c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(WAKE_TYPE_FULL, mFullTimers, mUnpluggables); 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull = t; 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case WAKE_TYPE_WINDOW: 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = wl.mTimerWindow; 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t == null) { 2368c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(WAKE_TYPE_WINDOW, mWindowTimers, mUnpluggables); 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow = t; 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException("type=" + type); 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2377c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) { 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Sensor se = mSensorStats.get(sensor); 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se == null) { 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!create) { 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se = new Sensor(sensor); 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorStats.put(sensor, se); 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2386c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = se.mTimer; 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2390c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor); 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (timers == null) { 2392c64edde69d18498fb2954f71a546357b07ab996aEvan Millar timers = new ArrayList<StopwatchTimer>(); 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSensorTimers.put(sensor, timers); 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2395c64edde69d18498fb2954f71a546357b07ab996aEvan Millar t = new StopwatchTimer(BatteryStats.SENSOR, timers, mUnpluggables); 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer = t; 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return t; 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartWakeLocked(String name, int type) { 2401c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopWakeLocked(String name, int type) { 2408c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getWakeTimerLocked(name, type); 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int sensor) { 2415c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, true); 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int sensor) { 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't create a timer if one doesn't already exist 2423c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(sensor, false); 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps() { 2430c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true); 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.startRunningLocked(BatteryStatsImpl.this); 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps() { 2437c64edde69d18498fb2954f71a546357b07ab996aEvan Millar StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false); 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (t != null) { 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t.stopRunningLocked(BatteryStatsImpl.this); 2440244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getBatteryStats() { 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return BatteryStatsImpl.this; 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(String filename) { 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile = new File(filename); 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackupFile = new File(filename + ".bak"); 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 2452c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables); 2453617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 2454c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables); 2455617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2456617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables); 2457c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables); 2458627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 2459c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables); 2460627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2461627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 2462c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables); 2463627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2464c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiOnTimer = new StopwatchTimer(-3, null, mUnpluggables); 2465c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiRunningTimer = new StopwatchTimer(-4, null, mUnpluggables); 2466c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mBluetoothOnTimer = new StopwatchTimer(-5, null, mUnpluggables); 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = false; 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = 0; 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = 0; 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = mTrackBatteryUptimeStart = SystemClock.uptimeMillis() * 1000; 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = mTrackBatteryRealtimeStart = SystemClock.elapsedRealtime() * 1000; 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(mUptimeStart); 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(mRealtimeStart); 2474633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = 0; 2475633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = 0; 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl(Parcel p) { 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile = mBackupFile = null; 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcel(p); 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getStartCount() { 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStartCount; 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mOnBattery; 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2492105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void setOnBattery(boolean onBattery, int level) { 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized(this) { 2494c64edde69d18498fb2954f71a546357b07ab996aEvan Millar updateKernelWakelocksLocked(); 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBattery != onBattery) { 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = mOnBatteryInternal = onBattery; 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long uptime = SystemClock.uptimeMillis() * 1000; 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long mSecRealtime = SystemClock.elapsedRealtime(); 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long realtime = mSecRealtime * 1000; 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (onBattery) { 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = uptime; 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = realtime; 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = getBatteryUptimeLocked(uptime); 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = getBatteryRealtimeLocked(realtime); 2506633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = mDischargeStartLevel = level; 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doUnplug(mUnpluggedBatteryUptime, mUnpluggedBatteryRealtime); 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime += uptime - mTrackBatteryUptimeStart; 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime += realtime - mTrackBatteryRealtimeStart; 2511633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = level; 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project doPlug(getBatteryUptimeLocked(uptime), getBatteryRealtimeLocked(realtime)); 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mLastWriteTime + (60 * 1000)) < mSecRealtime) { 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFile != null) { 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeLocked(); 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2522633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 2523633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public void recordCurrentLevel(int level) { 2524633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = level; 2525633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 2526c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2527c64edde69d18498fb2954f71a546357b07ab996aEvan Millar public void updateKernelWakelocksLocked() { 2528c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Map<String, KernelWakelockStats> m = readKernelWakelockStats(); 2529c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2530d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen if (m == null) { 2531d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen // Not crashing might make board bringup easier. 2532d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen Log.w(TAG, "Couldn't get kernel wake lock stats"); 2533d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen return; 2534d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen } 2535d8593312296fd2193a070c1a074840d83b7f49cbMarco Nelissen 2536c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, KernelWakelockStats> ent : m.entrySet()) { 2537c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String name = ent.getKey(); 2538c64edde69d18498fb2954f71a546357b07ab996aEvan Millar KernelWakelockStats kws = ent.getValue(); 2539c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2540c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = mKernelWakelockStats.get(name); 2541c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt == null) { 2542c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt = new SamplingTimer(mUnpluggables, mOnBatteryInternal, 2543c64edde69d18498fb2954f71a546357b07ab996aEvan Millar true /* track reported values */); 2544c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(name, kwlt); 2545c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2546c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedCount(kws.mCount); 2547c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.updateCurrentReportedTotalTime(kws.mTotalTime); 2548c64edde69d18498fb2954f71a546357b07ab996aEvan Millar kwlt.setUpdateVersion(sKernelWakelockUpdateVersion); 2549c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2550c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 2551c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (m.size() != mKernelWakelockStats.size()) { 2552c64edde69d18498fb2954f71a546357b07ab996aEvan Millar // Set timers to stale if they didn't appear in /proc/wakelocks this time. 2553c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 2554c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer st = ent.getValue(); 2555c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (st.getUpdateVersion() != sKernelWakelockUpdateVersion) { 2556c64edde69d18498fb2954f71a546357b07ab996aEvan Millar st.setStale(); 2557c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2558c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2559c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2560c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT); 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery(); 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeUptime(long curTime, int which) { 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: return mUptime + (curTime-mUptimeStart); 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastUptime; 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mUptimeStart); 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: return (curTime-mTrackBatteryUptimeStart); 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeRealtime(long curTime, int which) { 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: return mRealtime + (curTime-mRealtimeStart); 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: return mLastRealtime; 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: return (curTime-mRealtimeStart); 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: return (curTime-mTrackBatteryRealtimeStart); 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryUptime(long curTime, int which) { 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryUptime + getBatteryUptime(curTime); 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastUptime; 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(curTime); 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime) - mUnpluggedBatteryUptime; 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long computeBatteryRealtime(long curTime, int which) { 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (which) { 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_TOTAL: 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryRealtime + getBatteryRealtimeLocked(curTime); 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_LAST: 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBatteryLastRealtime; 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_CURRENT: 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case STATS_UNPLUGGED: 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime) - mUnpluggedBatteryRealtime; 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked(long curTime) { 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastUptime; 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryUptimeStart; 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryUptimeLocked() { 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptime(SystemClock.uptimeMillis() * 1000); 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryUptime(long curTime) { 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryUptimeLocked(curTime); 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long getBatteryRealtimeLocked(long curTime) { 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = mTrackBatteryPastRealtime; 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mOnBatteryInternal) { 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time += curTime - mTrackBatteryRealtimeStart; 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return time; 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getBatteryRealtime(long curTime) { 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBatteryRealtimeLocked(curTime); 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2651105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2652105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2653633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevel() { 2654105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 2655633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeStartLevelLocked(); 2656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2657105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2658105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2659633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeStartLevelLocked() { 2660633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return mDischargeStartLevel; 2661105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2662105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2663105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project @Override 2664633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevel() { 2665105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized(this) { 2666633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return getDischargeCurrentLevelLocked(); 2667105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2668105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 2669105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 2670633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public int getDischargeCurrentLevelLocked() { 2671633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar return mDischargeCurrentLevel; 2672105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular uid, creating if needed. 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid getUidStatsLocked(int uid) { 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.get(uid); 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (u == null) { 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u = new Uid(uid); 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u; 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove the statistics object for a particular uid. 26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void removeUidStatsLocked(int uid) { 26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.remove(uid); 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Proc getProcessStatsLocked(int uid, String name) { 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getProcessStatsLocked(name); 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular process, creating 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg getPackageStatsLocked(int uid, String pkg) { 27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getPackageStatsLocked(pkg); 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Retrieve the statistics object for a particular service, creating 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if needed. 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) { 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = getUidStatsLocked(uid); 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return u.getServiceStatsLocked(pkg, name); 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeLocked() { 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mFile == null) || (mBackupFile == null)) { 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BatteryStats", "writeLocked: no file associated with this instance"); 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Keep the old file around until we know the new one has 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // been successfully written. 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFile.exists()) { 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBackupFile.exists()) { 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackupFile.delete(); 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFile.renameTo(mBackupFile); 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileOutputStream stream = new FileOutputStream(mFile); 27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeSummaryToParcel(out); 27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.write(out.marshall()); 27409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.flush(); 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBackupFile.delete(); 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = SystemClock.elapsedRealtime(); 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("BatteryStats", "Error writing battery statistics", e); 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static byte[] readFully(FileInputStream stream) throws java.io.IOException { 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int pos = 0; 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int avail = stream.available(); 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = new byte[avail]; 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (true) { 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int amt = stream.read(data, pos, data.length-pos); 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "Read " + amt + " bytes at " + pos 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " of avail " + data.length); 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (amt <= 0) { 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i("foo", "**** FINISHED READING: pos=" + pos 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // + " len=" + data.length); 27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pos += amt; 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project avail = stream.available(); 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (avail > data.length-pos) { 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] newData = new byte[pos+avail]; 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(data, 0, newData, 0, pos); 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = newData; 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readLocked() { 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((mFile == null) || (mBackupFile == null)) { 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BatteryStats", "readLocked: no file associated with this instance"); 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project FileInputStream stream = null; 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mBackupFile.exists()) { 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream = new FileInputStream(mBackupFile); 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (java.io.IOException e) { 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We'll try for the normal settings file. 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (stream == null) { 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!mFile.exists()) { 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream = new FileInputStream(mFile); 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] raw = readFully(stream); 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel in = Parcel.obtain(); 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.unmarshall(raw, 0, raw.length); 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project in.setDataPosition(0); 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project stream.close(); 28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readSummaryFromParcel(in); 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch(java.io.IOException e) { 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e("BatteryStats", "Error reading battery statistics", e); 28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int describeContents() { 28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void readSummaryFromParcel(Parcel in) { 28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int version = in.readInt(); 28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (version != VERSION) { 28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("BatteryStats", "readFromParcel: version got " + version 28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ", expected " + VERSION + "; erasing old stats"); 28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastUptime = in.readLong(); 28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastRealtime = in.readLong(); 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUptime = in.readLong(); 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastRealtime = in.readLong(); 2833633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = in.readInt(); 2834633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 2835105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount++; 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.readSummaryFromParcelLocked(in); 2840617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 2841617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in); 2842617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2843617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.readSummaryFromParcelLocked(in); 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.readSummaryFromParcelLocked(in); 2846627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 2847627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in); 2848627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2849627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 2850627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in); 2851627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2852105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 2853105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.readSummaryFromParcelLocked(in); 2854d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 2855d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.readSummaryFromParcelLocked(in); 2856105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 2857105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.readSummaryFromParcelLocked(in); 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 2860c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 2861c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 2862c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String kwltName = in.readString(); 2863c64edde69d18498fb2954f71a546357b07ab996aEvan Millar getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in); 2864c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2865c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 2866c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = in.readInt(); 28689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 28699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 28709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 28719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.put(uid, u); 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2873617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOn = false; 2874617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOnTimer.readSummaryFromParcelLocked(in); 2875105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockOut = false; 2876105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockTimer.readSummaryFromParcelLocked(in); 2877244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mAudioTurnedOn = false; 2878244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mAudioTurnedOnTimer.readSummaryFromParcelLocked(in); 2879244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mVideoTurnedOn = false; 2880244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani u.mVideoTurnedOnTimer.readSummaryFromParcelLocked(in); 2881105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockOut = false; 2882105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockTimer.readSummaryFromParcelLocked(in); 28835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastEnabled = false; 28845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastTimer.readSummaryFromParcelLocked(in); 28855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 2886617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (in.readInt() != 0) { 2887617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 2888617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.initUserActivityLocked(); 2889617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2890617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 2891617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].readSummaryFromParcelLocked(in); 2892617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2893617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2894617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = in.readInt(); 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iw = 0; iw < NW; iw++) { 28979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String wlName = in.readString(); 28989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in); 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in); 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getWakeTimerLocked(wlName, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in); 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = in.readInt(); 29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NP; is++) { 29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int seNumber = in.readInt(); 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (in.readInt() != 0) { 29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.getSensorTimerLocked(seNumber, true) 29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .readSummaryFromParcelLocked(in); 29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String procName = in.readString(); 29219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc p = u.getProcessStatsLocked(procName); 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mUserTime = p.mLoadedUserTime = in.readLong(); 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastUserTime = in.readLong(); 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mSystemTime = p.mLoadedSystemTime = in.readLong(); 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastSystemTime = in.readLong(); 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mStarts = p.mLoadedStarts = in.readInt(); 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastStarts = in.readInt(); 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = in.readInt(); 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int ip = 0; ip < NP; ip++) { 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = in.readString(); 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg p = u.getPackageStatsLocked(pkgName); 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mWakeups = p.mLoadedWakeups = in.readInt(); 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.mLastWakeups = in.readInt(); 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = in.readInt(); 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int is = 0; is < NS; is++) { 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String servName = in.readString(); 29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName); 29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStartTime = s.mLoadedStartTime = in.readLong(); 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastStartTime = in.readLong(); 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mStarts = s.mLoadedStarts = in.readInt(); 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastStarts = in.readInt(); 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLaunches = s.mLoadedLaunches = in.readInt(); 29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.mLastLaunches = in.readInt(); 29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesReceived = in.readLong(); 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.mLoadedTcpBytesSent = in.readLong(); 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Writes a summary of the statistics to a Parcel, in a format suitable to be written to 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * disk. This format does not allow a lossless round-trip. 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param out the Parcel to be written to. 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeSummaryToParcel(Parcel out) { 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW_SYS = SystemClock.uptimeMillis() * 1000; 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000; 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOW = getBatteryUptimeLocked(NOW_SYS); 29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long NOWREAL = getBatteryRealtimeLocked(NOWREAL_SYS); 29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(VERSION); 29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryUptime(NOW_SYS, STATS_TOTAL)); 29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryUptime(NOW_SYS, STATS_CURRENT)); 29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_TOTAL)); 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeBatteryRealtime(NOWREAL_SYS, STATS_CURRENT)); 29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeUptime(NOW_SYS, STATS_TOTAL)); 29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeUptime(NOW_SYS, STATS_CURRENT)); 29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRealtime(NOWREAL_SYS, STATS_TOTAL)); 29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(computeRealtime(NOWREAL_SYS, STATS_CURRENT)); 2977633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeStartLevel); 2978633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 2979105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2982617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 2983617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 2984617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 2985617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeSummaryFromParcelLocked(out); 29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2987627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 2988627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 2989627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2990627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 2991627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL); 2992627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 2993105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2994d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL); 2995105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2997c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 2998c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 2999c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer kwlt = ent.getValue(); 3000c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 3001c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 3002c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 3003c64edde69d18498fb2954f71a546357b07ab996aEvan Millar ent.getValue().writeSummaryFromParcelLocked(out, NOWREAL); 3004c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 3005c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 3006c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3007c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3008c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NU = mUidStats.size(); 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NU); 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int iu = 0; iu < NU; iu++) { 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(iu)); 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = mUidStats.valueAt(iu); 3014105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 3015617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mWifiTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3016105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 3017105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project u.mScanWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL); 30185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL); 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3020617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn if (u.mUserActivityCounters == null) { 3021617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(0); 3022617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } else { 3023617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn out.writeInt(1); 3024617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) { 3025617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out); 3026617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3027617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3028617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NW = u.mWakelockStats.size(); 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NW); 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NW > 0) { 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Wakelock> ent 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mWakelockStats.entrySet()) { 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Wakelock wl = ent.getValue(); 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerFull != null) { 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL); 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerPartial != null) { 30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL); 30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (wl.mTimerWindow != null) { 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL); 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NSE = u.mSensorStats.size(); 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NSE); 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NSE > 0) { 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<Integer, BatteryStatsImpl.Uid.Sensor> ent 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mSensorStats.entrySet()) { 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ent.getKey()); 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Sensor se = ent.getValue(); 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (se.mTimer != null) { 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(1); 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL); 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(0); 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int NP = u.mProcessStats.size(); 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Proc> ent 30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mProcessStats.entrySet()) { 30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Proc ps = ent.getValue(); 30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime); 30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mUserTime - ps.mLoadedUserTime); 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime); 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(ps.mSystemTime - ps.mLoadedSystemTime); 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts); 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mStarts - ps.mLoadedStarts); 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project NP = u.mPackageStats.size(); 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NP); 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NP > 0) { 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : u.mPackageStats.entrySet()) { 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(ent.getKey()); 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid.Pkg ps = ent.getValue(); 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups); 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ps.mWakeups - ps.mLoadedWakeups); 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NS = ps.mServiceStats.size(); 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(NS); 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (NS > 0) { 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg.Serv> sent 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : ps.mServiceStats.entrySet()) { 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeString(sent.getKey()); 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsImpl.Uid.Pkg.Serv ss = sent.getValue(); 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project long time = ss.getStartTimeToNowLocked(NOW); 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time); 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(time - ss.mLoadedStartTime); 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts); 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mStarts - ss.mLoadedStarts); 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches); 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(ss.mLaunches - ss.mLoadedLaunches); 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(u.getTcpBytesReceived(STATS_TOTAL)); 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(u.getTcpBytesSent(STATS_TOTAL)); 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void readFromParcel(Parcel in) { 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readFromParcelLocked(in); 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void readFromParcelLocked(Parcel in) { 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int magic = in.readInt(); 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (magic != MAGIC) { 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ParcelFormatException("Bad magic number"); 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStartCount = in.readInt(); 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryUptime = in.readLong(); 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastUptime = in.readLong(); 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryRealtime = in.readLong(); 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBatteryLastRealtime = in.readLong(); 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOn = false; 3138c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenOnTimer = new StopwatchTimer(-1, null, mUnpluggables, in); 3139617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3140c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mScreenBrightnessTimer[i] = new StopwatchTimer(-100-i, null, mUnpluggables, in); 3141617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3142617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter = new Counter(mUnpluggables, in); 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOn = false; 3144c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 3145627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3146c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(-200-i, null, mUnpluggables, in); 3147627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3148627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3149c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mPhoneDataConnectionsTimer[i] = new StopwatchTimer(-300-i, null, mUnpluggables, in); 3150627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3151105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOn = false; 3152c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 3153d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunning = false; 3154c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mWifiRunningTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 3155105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOn = false; 3156c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mBluetoothOnTimer = new StopwatchTimer(-2, null, mUnpluggables, in); 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptime = in.readLong(); 31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUptimeStart = in.readLong(); 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastUptime = in.readLong(); 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtime = in.readLong(); 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mRealtimeStart = in.readLong(); 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastRealtime = in.readLong(); 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBattery = in.readInt() != 0; 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mOnBatteryInternal = false; // we are no longer really running. 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastUptime = in.readLong(); 31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryUptimeStart = in.readLong(); 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryPastRealtime = in.readLong(); 31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mTrackBatteryRealtimeStart = in.readLong(); 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryUptime = in.readLong(); 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUnpluggedBatteryRealtime = in.readLong(); 3171633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeStartLevel = in.readInt(); 3172633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mDischargeCurrentLevel = in.readInt(); 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLastWriteTime = in.readLong(); 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3175c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.clear(); 3176c64edde69d18498fb2954f71a546357b07ab996aEvan Millar int NKW = in.readInt(); 3177c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (int ikw = 0; ikw < NKW; ikw++) { 3178c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (in.readInt() != 0) { 3179c64edde69d18498fb2954f71a546357b07ab996aEvan Millar String wakelockName = in.readString(); 3180244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani in.readInt(); // Extra 0/1 written by Timer.writeTimerToParcel 3181c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = new SamplingTimer(mUnpluggables, mOnBattery, in); 3182c64edde69d18498fb2954f71a546357b07ab996aEvan Millar mKernelWakelockStats.put(wakelockName, kwlt); 3183c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3184c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3185c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPartialTimers.clear(); 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFullTimers.clear(); 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWindowTimers.clear(); 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numUids = in.readInt(); 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.clear(); 31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numUids; i++) { 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int uid = in.readInt(); 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid u = new Uid(uid); 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project u.readFromParcelLocked(mUnpluggables, in); 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mUidStats.append(uid, u); 31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void writeToParcel(Parcel out, int flags) { 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project writeToParcelLocked(out, flags); 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void writeToParcelLocked(Parcel out, int flags) { 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecUptime = SystemClock.uptimeMillis() * 1000; 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long uSecRealtime = SystemClock.elapsedRealtime() * 1000; 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryUptime = getBatteryUptimeLocked(uSecUptime); 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final long batteryRealtime = getBatteryRealtimeLocked(uSecRealtime); 32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(MAGIC); 32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mStartCount); 32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryUptime); 32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryLastUptime); 32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryRealtime); 32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mBatteryLastRealtime); 32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mScreenOnTimer.writeToParcel(out, batteryRealtime); 3218617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 3219617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mScreenBrightnessTimer[i].writeToParcel(out, batteryRealtime); 3220617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 3221617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mInputEventCounter.writeToParcel(out); 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mPhoneOnTimer.writeToParcel(out, batteryRealtime); 3223627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 3224627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneSignalStrengthsTimer[i].writeToParcel(out, batteryRealtime); 3225627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3226627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 3227627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mPhoneDataConnectionsTimer[i].writeToParcel(out, batteryRealtime); 3228627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3229105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mWifiOnTimer.writeToParcel(out, batteryRealtime); 3230d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mWifiRunningTimer.writeToParcel(out, batteryRealtime); 3231105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mBluetoothOnTimer.writeToParcel(out, batteryRealtime); 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptime); 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUptimeStart); 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastUptime); 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtime); 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mRealtimeStart); 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastRealtime); 32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mOnBattery ? 1 : 0); 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryUptime); 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryUptimeStart); 32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(batteryRealtime); 32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mTrackBatteryRealtimeStart); 32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryUptime); 32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mUnpluggedBatteryRealtime); 3245633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeStartLevel); 3246633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar out.writeInt(mDischargeCurrentLevel); 32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeLong(mLastWriteTime); 32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(mKernelWakelockStats.size()); 3250c64edde69d18498fb2954f71a546357b07ab996aEvan Millar for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) { 3251c64edde69d18498fb2954f71a546357b07ab996aEvan Millar SamplingTimer kwlt = ent.getValue(); 3252c64edde69d18498fb2954f71a546357b07ab996aEvan Millar if (kwlt != null) { 3253c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(1); 3254c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeString(ent.getKey()); 3255c64edde69d18498fb2954f71a546357b07ab996aEvan Millar Timer.writeTimerToParcel(out, kwlt, batteryRealtime); 3256c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } else { 3257c64edde69d18498fb2954f71a546357b07ab996aEvan Millar out.writeInt(0); 3258c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3259c64edde69d18498fb2954f71a546357b07ab996aEvan Millar } 3260c64edde69d18498fb2954f71a546357b07ab996aEvan Millar 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int size = mUidStats.size(); 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(size); 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < size; i++) { 32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.writeInt(mUidStats.keyAt(i)); 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Uid uid = mUidStats.valueAt(i); 32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uid.writeToParcelLocked(out, batteryRealtime); 32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final Parcelable.Creator<BatteryStatsImpl> CREATOR = 32729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new Parcelable.Creator<BatteryStatsImpl>() { 32739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl createFromParcel(Parcel in) { 32749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl(in); 32759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl[] newArray(int size) { 32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BatteryStatsImpl[size]; 32799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 32819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public void dumpLocked(PrintWriter pw) { 32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (DEBUG) { 32841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Printer pr = new PrintWriterPrinter(pw); 32851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen timer:"); 32861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenOnTimer.logState(pr, " "); 3287617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { 32881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Screen brightness #" + i + ":"); 32891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mScreenBrightnessTimer[i].logState(pr, " "); 3290617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 32911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Input event counter:"); 32921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mInputEventCounter.logState(pr, " "); 32931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Phone timer:"); 32941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneOnTimer.logState(pr, " "); 3295627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_SIGNAL_STRENGTH_BINS; i++) { 32961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Signal strength #" + i + ":"); 32971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneSignalStrengthsTimer[i].logState(pr, " "); 3298627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 3299627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) { 33001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Data connection type #" + i + ":"); 33011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mPhoneDataConnectionsTimer[i].logState(pr, " "); 33021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 33031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Wifi timer:"); 33041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiOnTimer.logState(pr, " "); 33051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** WifiRunning timer:"); 33061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mWifiRunningTimer.logState(pr, " "); 33071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn pr.println("*** Bluetooth timer:"); 33081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mBluetoothOnTimer.logState(pr, " "); 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.dumpLocked(pw); 33119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3313