blob: f73df005c7f18c6ec30083cf751372a64ec72087 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2006-2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.internal.os;
18
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -070019import android.annotation.Nullable;
Dianne Hackborn61659e52014-07-09 16:13:01 -070020import android.app.ActivityManager;
Adam Lesinski33dac552015-03-09 15:24:48 -070021import android.bluetooth.BluetoothActivityEnergyInfo;
Dianne Hackborna7c837f2014-01-15 16:20:44 -080022import android.content.Context;
Dianne Hackborn4870e9d2015-04-08 16:55:47 -070023import android.content.Intent;
Jeff Sharkey1059c3c2011-10-04 16:54:49 -070024import android.net.ConnectivityManager;
25import android.net.NetworkStats;
Adam Lesinski33dac552015-03-09 15:24:48 -070026import android.net.wifi.WifiActivityEnergyInfo;
Dianne Hackborn3251b902014-06-20 14:40:53 -070027import android.net.wifi.WifiManager;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -070028import android.os.BatteryManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080029import android.os.BatteryStats;
Dianne Hackborncd0e3352014-08-07 17:08:09 -070030import android.os.Build;
Dianne Hackborn8bdf5932010-10-15 12:54:40 -070031import android.os.FileUtils;
Dianne Hackborn0d903a82010-09-07 23:51:03 -070032import android.os.Handler;
Jeff Brown6f357d32014-01-15 20:40:55 -080033import android.os.Looper;
Dianne Hackborn0d903a82010-09-07 23:51:03 -070034import android.os.Message;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080035import android.os.Parcel;
36import android.os.ParcelFormatException;
37import android.os.Parcelable;
Evan Millarc64edde2009-04-18 12:26:32 -070038import android.os.Process;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080039import android.os.SystemClock;
Jeff Sharkey418d12d2011-12-13 15:38:03 -080040import android.os.SystemProperties;
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -070041import android.os.WorkSource;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -070042import android.telephony.DataConnectionRealTimeInfo;
Amith Yamasanif37447b2009-10-08 18:28:01 -070043import android.telephony.ServiceState;
Wink Savillee9b06d72009-05-18 21:47:50 -070044import android.telephony.SignalStrength;
Dianne Hackborn627bba72009-03-24 22:32:56 -070045import android.telephony.TelephonyManager;
Jeff Sharkey9da2f1e2014-08-14 12:55:00 -070046import android.text.TextUtils;
Dianne Hackborn61659e52014-07-09 16:13:01 -070047import android.util.ArrayMap;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080048import android.util.Log;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -070049import android.util.LogWriter;
Dianne Hackbornd953c532014-08-16 18:17:38 -070050import android.util.MutableInt;
Dianne Hackborn1d442e02009-04-20 18:14:05 -070051import android.util.PrintWriterPrinter;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052import android.util.Printer;
Dianne Hackborn1afd1c92010-03-18 22:47:17 -070053import android.util.Slog;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080054import android.util.SparseArray;
Dianne Hackborn099bc622014-01-22 13:39:16 -080055import android.util.SparseIntArray;
Adam Lesinskie08af192015-03-25 16:42:59 -070056import android.util.SparseLongArray;
Dianne Hackbornae384452011-06-28 12:33:48 -070057import android.util.TimeUtils;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -080058import android.util.Xml;
Jeff Browne95c3cd2014-05-02 16:59:26 -070059import android.view.Display;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080060
Jeff Sharkey1059c3c2011-10-04 16:54:49 -070061import com.android.internal.net.NetworkStatsFactory;
Dianne Hackbornd0c5b9a2014-02-21 16:19:05 -080062import com.android.internal.util.ArrayUtils;
Dianne Hackborn8c841092013-06-24 13:46:13 -070063import com.android.internal.util.FastPrintWriter;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -080064import com.android.internal.util.FastXmlSerializer;
Jeff Sharkey1059c3c2011-10-04 16:54:49 -070065import com.android.internal.util.JournaledFile;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -080066import com.android.internal.util.XmlUtils;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -070067import com.android.server.NetworkManagementSocketTagger;
68import libcore.util.EmptyArray;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -080069import org.xmlpull.v1.XmlPullParser;
70import org.xmlpull.v1.XmlPullParserException;
71import org.xmlpull.v1.XmlSerializer;
Jeff Sharkey1059c3c2011-10-04 16:54:49 -070072
Dianne Hackbornd4a8af72015-03-03 10:06:15 -080073import java.io.ByteArrayOutputStream;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080074import java.io.File;
75import java.io.FileInputStream;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -080076import java.io.FileNotFoundException;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080077import java.io.FileOutputStream;
78import java.io.IOException;
Dianne Hackborn1d442e02009-04-20 18:14:05 -070079import java.io.PrintWriter;
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +010080import java.nio.charset.StandardCharsets;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080081import java.util.ArrayList;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -080082import java.util.Calendar;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080083import java.util.HashMap;
Evan Millarc64edde2009-04-18 12:26:32 -070084import java.util.Iterator;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080085import java.util.Map;
Christopher Tate4cee7252010-03-19 14:50:40 -070086import java.util.concurrent.atomic.AtomicInteger;
Dianne Hackbornce2ef762010-09-20 11:39:14 -070087import java.util.concurrent.locks.ReentrantLock;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080088
89/**
90 * All information we are collecting about things that can happen that impact
91 * battery life. All times are represented in microseconds except where indicated
92 * otherwise.
93 */
94public final class BatteryStatsImpl extends BatteryStats {
95 private static final String TAG = "BatteryStatsImpl";
Dianne Hackborneaf2ac42014-02-07 13:01:07 -080096 private static final boolean DEBUG = false;
Adam Lesinskia7c90c82015-06-18 14:52:24 -070097 public static final boolean DEBUG_ENERGY = false;
98 private static final boolean DEBUG_ENERGY_CPU = DEBUG_ENERGY || false;
Dianne Hackborn32907cf2010-06-10 17:50:20 -070099 private static final boolean DEBUG_HISTORY = false;
Dianne Hackborne8c88e62011-08-17 19:09:09 -0700100 private static final boolean USE_OLD_HISTORY = false; // for debugging.
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700101
Jeff Sharkey1059c3c2011-10-04 16:54:49 -0700102 // TODO: remove "tcp" from network methods, since we measure total stats.
103
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800104 // In-memory Parcel magic number, used to detect attempts to unmarshall bad data
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700105 private static final int MAGIC = 0xBA757475; // 'BATSTATS'
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800106
107 // Current on-disk Parcel version
Dianne Hackborn08c47a52015-10-15 12:38:14 -0700108 private static final int VERSION = 135 + (USE_OLD_HISTORY ? 1000 : 0);
Amith Yamasanie43530a2009-08-21 13:11:37 -0700109
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700110 // Maximum number of items we will record in the history.
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700111 private static final int MAX_HISTORY_ITEMS = 2000;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700112
Dianne Hackbornf47d8f22010-10-08 10:46:55 -0700113 // No, really, THIS is the maximum number of items we will record in the history.
114 private static final int MAX_MAX_HISTORY_ITEMS = 3000;
115
Dianne Hackborn9e0f5d92010-02-22 15:05:42 -0800116 // The maximum number of names wakelocks we will keep track of
117 // per uid; once the limit is reached, we batch the remaining wakelocks
118 // in to one common name.
Dianne Hackbornacc4a122014-08-18 16:33:44 -0700119 private static final int MAX_WAKELOCKS_PER_UID = 100;
Dianne Hackbornc24ab862011-10-18 15:55:03 -0700120
Dianne Hackborn1afd1c92010-03-18 22:47:17 -0700121 private final JournaledFile mFile;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -0700122 public final AtomicFile mCheckinFile;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -0800123 public final AtomicFile mDailyFile;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800124
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700125 static final int MSG_UPDATE_WAKELOCKS = 1;
126 static final int MSG_REPORT_POWER_CHANGE = 2;
Dianne Hackborn4870e9d2015-04-08 16:55:47 -0700127 static final int MSG_REPORT_CHARGING = 3;
Dianne Hackborn287952c2010-09-22 22:34:31 -0700128 static final long DELAY_UPDATE_WAKELOCKS = 5*1000;
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700129
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700130 private final KernelWakelockReader mKernelWakelockReader = new KernelWakelockReader();
131 private final KernelWakelockStats mTmpWakelockStats = new KernelWakelockStats();
132
Adam Lesinski06af1fa2015-05-05 17:35:35 -0700133 private final KernelUidCpuTimeReader mKernelUidCpuTimeReader = new KernelUidCpuTimeReader();
Adam Lesinski6832f392015-09-05 18:05:40 -0700134 private KernelCpuSpeedReader[] mKernelCpuSpeedReaders;
Adam Lesinski06af1fa2015-05-05 17:35:35 -0700135
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700136 public interface BatteryCallback {
137 public void batteryNeedsCpuUpdate();
138 public void batteryPowerChanged(boolean onBattery);
Dianne Hackborn4870e9d2015-04-08 16:55:47 -0700139 public void batterySendBroadcast(Intent intent);
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700140 }
141
142 final class MyHandler extends Handler {
Jeff Brown6f357d32014-01-15 20:40:55 -0800143 public MyHandler(Looper looper) {
144 super(looper, null, true);
145 }
146
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700147 @Override
148 public void handleMessage(Message msg) {
149 BatteryCallback cb = mCallback;
150 switch (msg.what) {
151 case MSG_UPDATE_WAKELOCKS:
Adam Lesinski72478f02015-06-17 15:39:43 -0700152 synchronized (BatteryStatsImpl.this) {
153 updateCpuTimeLocked();
154 }
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700155 if (cb != null) {
156 cb.batteryNeedsCpuUpdate();
157 }
158 break;
159 case MSG_REPORT_POWER_CHANGE:
160 if (cb != null) {
161 cb.batteryPowerChanged(msg.arg1 != 0);
162 }
163 break;
Dianne Hackborn4870e9d2015-04-08 16:55:47 -0700164 case MSG_REPORT_CHARGING:
165 if (cb != null) {
166 final String action;
167 synchronized (BatteryStatsImpl.this) {
168 action = mCharging ? BatteryManager.ACTION_CHARGING
169 : BatteryManager.ACTION_DISCHARGING;
170 }
171 Intent intent = new Intent(action);
172 intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
173 cb.batterySendBroadcast(intent);
174 }
175 break;
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700176 }
177 }
178 }
179
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700180 public interface ExternalStatsSync {
Dianne Hackborn0c820db2015-04-14 17:47:34 -0700181 void scheduleSync(String reason);
Adam Lesinskia7c90c82015-06-18 14:52:24 -0700182 void scheduleWifiSync(String reason);
Adam Lesinski61db88f2015-07-01 15:05:07 -0700183 void scheduleCpuSyncDueToRemovedUid(int uid);
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700184 }
185
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -0700186 public final MyHandler mHandler;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700187 private final ExternalStatsSync mExternalSync;
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700188
189 private BatteryCallback mCallback;
190
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800191 /**
Dianne Hackborn099bc622014-01-22 13:39:16 -0800192 * Mapping isolated uids to the actual owning app uid.
193 */
194 final SparseIntArray mIsolatedUids = new SparseIntArray();
195
196 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800197 * The statistics we have collected organized by uids.
198 */
199 final SparseArray<BatteryStatsImpl.Uid> mUidStats =
200 new SparseArray<BatteryStatsImpl.Uid>();
201
202 // A set of pools of currently active timers. When a timer is queried, we will divide the
203 // elapsed time by the number of active timers to arrive at that timer's share of the time.
204 // In order to do this, we must refresh each timer whenever the number of active timers
205 // changes.
Adam Lesinskie08af192015-03-25 16:42:59 -0700206 final ArrayList<StopwatchTimer> mPartialTimers = new ArrayList<>();
207 final ArrayList<StopwatchTimer> mFullTimers = new ArrayList<>();
208 final ArrayList<StopwatchTimer> mWindowTimers = new ArrayList<>();
Jeff Brown6a8bd7b2015-06-19 15:07:51 -0700209 final ArrayList<StopwatchTimer> mDrawTimers = new ArrayList<>();
Adam Lesinskie08af192015-03-25 16:42:59 -0700210 final SparseArray<ArrayList<StopwatchTimer>> mSensorTimers = new SparseArray<>();
211 final ArrayList<StopwatchTimer> mWifiRunningTimers = new ArrayList<>();
212 final ArrayList<StopwatchTimer> mFullWifiLockTimers = new ArrayList<>();
213 final ArrayList<StopwatchTimer> mWifiMulticastTimers = new ArrayList<>();
214 final ArrayList<StopwatchTimer> mWifiScanTimers = new ArrayList<>();
215 final SparseArray<ArrayList<StopwatchTimer>> mWifiBatchedScanTimers = new SparseArray<>();
216 final ArrayList<StopwatchTimer> mAudioTurnedOnTimers = new ArrayList<>();
217 final ArrayList<StopwatchTimer> mVideoTurnedOnTimers = new ArrayList<>();
Ruben Brunk6d2c3632015-05-26 17:32:16 -0700218 final ArrayList<StopwatchTimer> mFlashlightTurnedOnTimers = new ArrayList<>();
219 final ArrayList<StopwatchTimer> mCameraTurnedOnTimers = new ArrayList<>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800220
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700221 // Last partial timers we use for distributing CPU usage.
Adam Lesinskie08af192015-03-25 16:42:59 -0700222 final ArrayList<StopwatchTimer> mLastPartialTimers = new ArrayList<>();
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700223
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800224 // These are the objects that will want to do something when the device
225 // is unplugged from power.
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800226 final TimeBase mOnBatteryTimeBase = new TimeBase();
227
228 // These are the objects that will want to do something when the device
229 // is unplugged from power *and* the screen is off.
230 final TimeBase mOnBatteryScreenOffTimeBase = new TimeBase();
231
232 // Set to true when we want to distribute CPU across wakelocks for the next
233 // CPU update, even if we aren't currently running wake locks.
234 boolean mDistributeWakelockCpu;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700235
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700236 boolean mShuttingDown;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700237
Dianne Hackborn37de0982014-05-09 09:32:18 -0700238 final HistoryEventTracker mActiveEvents = new HistoryEventTracker();
Dianne Hackborneaf2ac42014-02-07 13:01:07 -0800239
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700240 long mHistoryBaseTime;
241 boolean mHaveBatteryLevel = false;
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700242 boolean mRecordingHistory = false;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700243 int mNumHistoryItems;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -0700244
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -0700245 static final int MAX_HISTORY_BUFFER = 256*1024; // 256KB
246 static final int MAX_MAX_HISTORY_BUFFER = 320*1024; // 320KB
Dianne Hackborn0ffc9882011-04-13 18:15:56 -0700247 final Parcel mHistoryBuffer = Parcel.obtain();
248 final HistoryItem mHistoryLastWritten = new HistoryItem();
249 final HistoryItem mHistoryLastLastWritten = new HistoryItem();
Dianne Hackborn1fadab52011-04-14 17:57:33 -0700250 final HistoryItem mHistoryReadTmp = new HistoryItem();
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700251 final HistoryItem mHistoryAddTmp = new HistoryItem();
Adam Lesinskie08af192015-03-25 16:42:59 -0700252 final HashMap<HistoryTag, Integer> mHistoryTagPool = new HashMap<>();
Dianne Hackborn099bc622014-01-22 13:39:16 -0800253 String[] mReadHistoryStrings;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -0800254 int[] mReadHistoryUids;
255 int mReadHistoryChars;
256 int mNextHistoryTagIdx = 0;
257 int mNumHistoryTagChars = 0;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -0700258 int mHistoryBufferLastPos = -1;
259 boolean mHistoryOverflow = false;
Dianne Hackborn0c820db2015-04-14 17:47:34 -0700260 int mActiveHistoryStates = 0xffffffff;
261 int mActiveHistoryStates2 = 0xffffffff;
Dianne Hackborn40c87252014-03-19 16:55:40 -0700262 long mLastHistoryElapsedRealtime = 0;
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700263 long mTrackRunningHistoryElapsedRealtime = 0;
264 long mTrackRunningHistoryUptime = 0;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -0700265
266 final HistoryItem mHistoryCur = new HistoryItem();
267
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700268 HistoryItem mHistory;
269 HistoryItem mHistoryEnd;
Dianne Hackborn9adb9c32010-08-13 14:09:56 -0700270 HistoryItem mHistoryLastEnd;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700271 HistoryItem mHistoryCache;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -0700272
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -0800273 // Used by computeHistoryStepDetails
274 HistoryStepDetails mLastHistoryStepDetails = null;
275 byte mLastHistoryStepLevel = 0;
276 final HistoryStepDetails mCurHistoryStepDetails = new HistoryStepDetails();
277 final HistoryStepDetails mReadHistoryStepDetails = new HistoryStepDetails();
278 final HistoryStepDetails mTmpHistoryStepDetails = new HistoryStepDetails();
Adam Lesinski7b83b0c2015-06-05 12:59:36 -0700279
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -0800280 /**
Adam Lesinski7b83b0c2015-06-05 12:59:36 -0700281 * Total time (in milliseconds) spent executing in user code.
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -0800282 */
283 long mLastStepCpuUserTime;
284 long mCurStepCpuUserTime;
285 /**
Adam Lesinski7b83b0c2015-06-05 12:59:36 -0700286 * Total time (in milliseconds) spent executing in kernel code.
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -0800287 */
288 long mLastStepCpuSystemTime;
289 long mCurStepCpuSystemTime;
290 /**
Adam Lesinski7b83b0c2015-06-05 12:59:36 -0700291 * Times from /proc/stat (but measured in milliseconds).
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -0800292 */
293 long mLastStepStatUserTime;
294 long mLastStepStatSystemTime;
295 long mLastStepStatIOWaitTime;
296 long mLastStepStatIrqTime;
297 long mLastStepStatSoftIrqTime;
298 long mLastStepStatIdleTime;
299 long mCurStepStatUserTime;
300 long mCurStepStatSystemTime;
301 long mCurStepStatIOWaitTime;
302 long mCurStepStatIrqTime;
303 long mCurStepStatSoftIrqTime;
304 long mCurStepStatIdleTime;
305
Dianne Hackborn0ffc9882011-04-13 18:15:56 -0700306 private HistoryItem mHistoryIterator;
307 private boolean mReadOverflow;
308 private boolean mIteratingHistory;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700309
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800310 int mStartCount;
311
Dianne Hackborn5f4a5f92014-01-24 16:59:34 -0800312 long mStartClockTime;
Dianne Hackborncd0e3352014-08-07 17:08:09 -0700313 String mStartPlatformVersion;
314 String mEndPlatformVersion;
Dianne Hackborn5f4a5f92014-01-24 16:59:34 -0800315
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800316 long mUptime;
317 long mUptimeStart;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800318 long mRealtime;
319 long mRealtimeStart;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700320
Dianne Hackborn3d658bf2014-02-05 13:38:56 -0800321 int mWakeLockNesting;
322 boolean mWakeLockImportant;
Dianne Hackborn0c820db2015-04-14 17:47:34 -0700323 public boolean mRecordAllHistory;
Dianne Hackborn9a755432014-05-15 17:05:22 -0700324 boolean mNoAutoReset;
Dianne Hackborn3d658bf2014-02-05 13:38:56 -0800325
Jeff Browne95c3cd2014-05-02 16:59:26 -0700326 int mScreenState = Display.STATE_UNKNOWN;
Evan Millarc64edde2009-04-18 12:26:32 -0700327 StopwatchTimer mScreenOnTimer;
Amith Yamasani3718aaa2009-06-09 06:32:35 -0700328
Dianne Hackborn617f8772009-03-31 15:04:46 -0700329 int mScreenBrightnessBin = -1;
Evan Millarc64edde2009-04-18 12:26:32 -0700330 final StopwatchTimer[] mScreenBrightnessTimer = new StopwatchTimer[NUM_SCREEN_BRIGHTNESS_BINS];
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700331
Jeff Browne95c3cd2014-05-02 16:59:26 -0700332 boolean mInteractive;
333 StopwatchTimer mInteractiveTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700334
Dianne Hackborn8ad2af72015-03-17 17:00:24 -0700335 boolean mPowerSaveModeEnabled;
336 StopwatchTimer mPowerSaveModeEnabledTimer;
337
Dianne Hackborn88e98df2015-03-23 13:29:14 -0700338 boolean mDeviceIdling;
339 StopwatchTimer mDeviceIdlingTimer;
340
Dianne Hackborn08c47a52015-10-15 12:38:14 -0700341 boolean mDeviceLightIdling;
342 StopwatchTimer mDeviceLightIdlingTimer;
343
344 int mDeviceIdleMode;
345 long mLastIdleTimeStart;
346 long mLongestLightIdleTime;
347 long mLongestFullIdleTime;
348 StopwatchTimer mDeviceIdleModeLightTimer;
349 StopwatchTimer mDeviceIdleModeFullTimer;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -0700350
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800351 boolean mPhoneOn;
Evan Millarc64edde2009-04-18 12:26:32 -0700352 StopwatchTimer mPhoneOnTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700353
Dianne Hackborn10eaa852014-07-22 22:54:55 -0700354 int mAudioOnNesting;
Amith Yamasani244fa5c2009-05-22 14:36:07 -0700355 StopwatchTimer mAudioOnTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700356
Dianne Hackborn10eaa852014-07-22 22:54:55 -0700357 int mVideoOnNesting;
Amith Yamasani244fa5c2009-05-22 14:36:07 -0700358 StopwatchTimer mVideoOnTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700359
Ruben Brunk6d2c3632015-05-26 17:32:16 -0700360 int mFlashlightOnNesting;
Dianne Hackbornabc7c492014-06-30 16:57:46 -0700361 StopwatchTimer mFlashlightOnTimer;
362
Ruben Brunk6d2c3632015-05-26 17:32:16 -0700363 int mCameraOnNesting;
364 StopwatchTimer mCameraOnTimer;
365
Dianne Hackborn627bba72009-03-24 22:32:56 -0700366 int mPhoneSignalStrengthBin = -1;
Dianne Hackborne4a59512010-12-07 11:08:07 -0800367 int mPhoneSignalStrengthBinRaw = -1;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700368 final StopwatchTimer[] mPhoneSignalStrengthsTimer =
Wink Saville52840902011-02-18 12:40:47 -0800369 new StopwatchTimer[SignalStrength.NUM_SIGNAL_STRENGTH_BINS];
Amith Yamasanif37447b2009-10-08 18:28:01 -0700370
371 StopwatchTimer mPhoneSignalScanningTimer;
372
Dianne Hackborn627bba72009-03-24 22:32:56 -0700373 int mPhoneDataConnectionType = -1;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700374 final StopwatchTimer[] mPhoneDataConnectionsTimer =
Evan Millarc64edde2009-04-18 12:26:32 -0700375 new StopwatchTimer[NUM_DATA_CONNECTION_TYPES];
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700376
Dianne Hackborn57ed6a62013-12-09 18:15:56 -0800377 final LongSamplingCounter[] mNetworkByteActivityCounters =
378 new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES];
379 final LongSamplingCounter[] mNetworkPacketActivityCounters =
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700380 new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES];
381
Adam Lesinski33dac552015-03-09 15:24:48 -0700382 final LongSamplingCounter[] mBluetoothActivityCounters =
383 new LongSamplingCounter[NUM_CONTROLLER_ACTIVITY_TYPES];
384
385 final LongSamplingCounter[] mWifiActivityCounters =
386 new LongSamplingCounter[NUM_CONTROLLER_ACTIVITY_TYPES];
387
The Android Open Source Project10592532009-03-18 17:39:46 -0700388 boolean mWifiOn;
Evan Millarc64edde2009-04-18 12:26:32 -0700389 StopwatchTimer mWifiOnTimer;
Eric Shienbroodd4c5f892009-03-24 18:13:20 -0700390
Dianne Hackborn58e0eef2010-09-16 01:22:10 -0700391 boolean mGlobalWifiRunning;
392 StopwatchTimer mGlobalWifiRunningTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700393
Dianne Hackbornca1bf212014-02-14 14:18:36 -0800394 int mWifiState = -1;
395 final StopwatchTimer[] mWifiStateTimer = new StopwatchTimer[NUM_WIFI_STATES];
396
Dianne Hackborn3251b902014-06-20 14:40:53 -0700397 int mWifiSupplState = -1;
398 final StopwatchTimer[] mWifiSupplStateTimer = new StopwatchTimer[NUM_WIFI_SUPPL_STATES];
399
400 int mWifiSignalStrengthBin = -1;
401 final StopwatchTimer[] mWifiSignalStrengthsTimer =
402 new StopwatchTimer[NUM_WIFI_SIGNAL_STRENGTH_BINS];
403
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -0700404 int mMobileRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
Dianne Hackbornf7097a52014-05-13 09:56:14 -0700405 long mMobileRadioActiveStartTime;
Dianne Hackborne13c4c02014-02-11 17:18:35 -0800406 StopwatchTimer mMobileRadioActiveTimer;
Dianne Hackborn77b987f2014-02-26 16:20:52 -0800407 StopwatchTimer mMobileRadioActivePerAppTimer;
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700408 LongSamplingCounter mMobileRadioActiveAdjustedTime;
Dianne Hackbornd45665b2014-02-26 12:35:32 -0800409 LongSamplingCounter mMobileRadioActiveUnknownTime;
410 LongSamplingCounter mMobileRadioActiveUnknownCount;
Dianne Hackborne13c4c02014-02-11 17:18:35 -0800411
Dianne Hackborn0c820db2015-04-14 17:47:34 -0700412 int mWifiRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
413
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800414 /**
415 * These provide time bases that discount the time the device is plugged
416 * in to power.
417 */
418 boolean mOnBattery;
419 boolean mOnBatteryInternal;
Amith Yamasani3718aaa2009-06-09 06:32:35 -0700420
Dianne Hackborn4870e9d2015-04-08 16:55:47 -0700421 /**
422 * External reporting of whether the device is actually charging.
423 */
424 boolean mCharging = true;
425 int mLastChargingStateLevel;
426
The Android Open Source Project10592532009-03-18 17:39:46 -0700427 /*
428 * These keep track of battery levels (1-100) at the last plug event and the last unplug event.
429 */
Evan Millar633a1742009-04-02 16:36:33 -0700430 int mDischargeStartLevel;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700431 int mDischargeUnplugLevel;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -0700432 int mDischargePlugLevel;
Evan Millar633a1742009-04-02 16:36:33 -0700433 int mDischargeCurrentLevel;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -0700434 int mCurrentBatteryLevel;
Dianne Hackborn3bee5af82010-07-23 00:22:04 -0700435 int mLowDischargeAmountSinceCharge;
436 int mHighDischargeAmountSinceCharge;
Dianne Hackbornc1b40e32011-01-05 18:27:40 -0800437 int mDischargeScreenOnUnplugLevel;
438 int mDischargeScreenOffUnplugLevel;
439 int mDischargeAmountScreenOn;
440 int mDischargeAmountScreenOnSinceCharge;
441 int mDischargeAmountScreenOff;
442 int mDischargeAmountScreenOffSinceCharge;
Amith Yamasani244fa5c2009-05-22 14:36:07 -0700443
Dianne Hackborncd0e3352014-08-07 17:08:09 -0700444 static final int MAX_LEVEL_STEPS = 200;
Dianne Hackborn260c5022014-04-29 11:23:16 -0700445
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -0700446 int mInitStepMode = 0;
447 int mCurStepMode = 0;
448 int mModStepMode = 0;
449
Dianne Hackborn260c5022014-04-29 11:23:16 -0700450 int mLastDischargeStepLevel;
Dianne Hackborn29325132014-05-21 15:01:03 -0700451 int mMinDischargeStepLevel;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -0800452 final LevelStepTracker mDischargeStepTracker = new LevelStepTracker(MAX_LEVEL_STEPS);
453 final LevelStepTracker mDailyDischargeStepTracker = new LevelStepTracker(MAX_LEVEL_STEPS*2);
Dianne Hackborn88e98df2015-03-23 13:29:14 -0700454 ArrayList<PackageChange> mDailyPackageChanges;
Dianne Hackborn260c5022014-04-29 11:23:16 -0700455
456 int mLastChargeStepLevel;
Dianne Hackborn29325132014-05-21 15:01:03 -0700457 int mMaxChargeStepLevel;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -0800458 final LevelStepTracker mChargeStepTracker = new LevelStepTracker(MAX_LEVEL_STEPS);
459 final LevelStepTracker mDailyChargeStepTracker = new LevelStepTracker(MAX_LEVEL_STEPS*2);
460
461 static final int MAX_DAILY_ITEMS = 10;
462
463 long mDailyStartTime = 0;
464 long mNextMinDailyDeadline = 0;
465 long mNextMaxDailyDeadline = 0;
466
467 final ArrayList<DailyItem> mDailyItems = new ArrayList<>();
Dianne Hackborn260c5022014-04-29 11:23:16 -0700468
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800469 long mLastWriteTime = 0; // Milliseconds
Amith Yamasani244fa5c2009-05-22 14:36:07 -0700470
Amith Yamasanif37447b2009-10-08 18:28:01 -0700471 private int mPhoneServiceState = -1;
Dianne Hackborne4a59512010-12-07 11:08:07 -0800472 private int mPhoneServiceStateRaw = -1;
473 private int mPhoneSimStateRaw = -1;
Amith Yamasanif37447b2009-10-08 18:28:01 -0700474
Dianne Hackborn1e01d162014-12-04 17:46:42 -0800475 private int mNumConnectivityChange;
476 private int mLoadedNumConnectivityChange;
477 private int mUnpluggedNumConnectivityChange;
478
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700479 private final NetworkStats.Entry mTmpNetworkStatsEntry = new NetworkStats.Entry();
480
Adam Lesinskie08af192015-03-25 16:42:59 -0700481 private PowerProfile mPowerProfile;
Adam Lesinski17390762015-04-10 13:17:47 -0700482 private boolean mHasWifiEnergyReporting = false;
483 private boolean mHasBluetoothEnergyReporting = false;
Adam Lesinskie08af192015-03-25 16:42:59 -0700484
Evan Millarc64edde2009-04-18 12:26:32 -0700485 /*
486 * Holds a SamplingTimer associated with each kernel wakelock name being tracked.
487 */
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700488 private final HashMap<String, SamplingTimer> mKernelWakelockStats = new HashMap<>();
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700489
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700490 public Map<String, ? extends Timer> getKernelWakelockStats() {
Evan Millarc64edde2009-04-18 12:26:32 -0700491 return mKernelWakelockStats;
492 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700493
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700494 String mLastWakeupReason = null;
495 long mLastWakeupUptimeMs = 0;
Dianne Hackbornc3940bc2014-09-05 15:50:25 -0700496 private final HashMap<String, SamplingTimer> mWakeupReasonStats = new HashMap<>();
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700497
Dianne Hackbornc3940bc2014-09-05 15:50:25 -0700498 public Map<String, ? extends Timer> getWakeupReasonStats() {
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700499 return mWakeupReasonStats;
500 }
501
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800502 public BatteryStatsImpl() {
Dianne Hackborn1afd1c92010-03-18 22:47:17 -0700503 mFile = null;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -0700504 mCheckinFile = null;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -0800505 mDailyFile = null;
Dianne Hackborn0d903a82010-09-07 23:51:03 -0700506 mHandler = null;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700507 mExternalSync = null;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -0700508 clearHistoryLocked();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800509 }
510
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800511 public static interface TimeBaseObs {
512 void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime);
513 void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime);
514 }
515
516 static class TimeBase {
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -0700517 private final ArrayList<TimeBaseObs> mObservers = new ArrayList<>();
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800518
519 private long mUptime;
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800520 private long mRealtime;
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800521
522 private boolean mRunning;
523
524 private long mPastUptime;
525 private long mUptimeStart;
526 private long mPastRealtime;
527 private long mRealtimeStart;
528 private long mUnpluggedUptime;
529 private long mUnpluggedRealtime;
530
531 public void dump(PrintWriter pw, String prefix) {
532 StringBuilder sb = new StringBuilder(128);
533 pw.print(prefix); pw.print("mRunning="); pw.println(mRunning);
534 sb.setLength(0);
535 sb.append(prefix);
536 sb.append("mUptime=");
Dianne Hackborn4590e522014-03-24 13:36:46 -0700537 formatTimeMs(sb, mUptime / 1000);
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800538 pw.println(sb.toString());
539 sb.setLength(0);
540 sb.append(prefix);
541 sb.append("mRealtime=");
Dianne Hackborn4590e522014-03-24 13:36:46 -0700542 formatTimeMs(sb, mRealtime / 1000);
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800543 pw.println(sb.toString());
544 sb.setLength(0);
545 sb.append(prefix);
546 sb.append("mPastUptime=");
547 formatTimeMs(sb, mPastUptime / 1000); sb.append("mUptimeStart=");
548 formatTimeMs(sb, mUptimeStart / 1000);
549 sb.append("mUnpluggedUptime="); formatTimeMs(sb, mUnpluggedUptime / 1000);
550 pw.println(sb.toString());
551 sb.setLength(0);
552 sb.append(prefix);
553 sb.append("mPastRealtime=");
554 formatTimeMs(sb, mPastRealtime / 1000); sb.append("mRealtimeStart=");
555 formatTimeMs(sb, mRealtimeStart / 1000);
556 sb.append("mUnpluggedRealtime="); formatTimeMs(sb, mUnpluggedRealtime / 1000);
557 pw.println(sb.toString());
558 }
559
560 public void add(TimeBaseObs observer) {
561 mObservers.add(observer);
562 }
563
564 public void remove(TimeBaseObs observer) {
565 if (!mObservers.remove(observer)) {
566 Slog.wtf(TAG, "Removed unknown observer: " + observer);
567 }
568 }
569
570 public void init(long uptime, long realtime) {
571 mRealtime = 0;
572 mUptime = 0;
573 mPastUptime = 0;
574 mPastRealtime = 0;
575 mUptimeStart = uptime;
576 mRealtimeStart = realtime;
577 mUnpluggedUptime = getUptime(mUptimeStart);
578 mUnpluggedRealtime = getRealtime(mRealtimeStart);
579 }
580
581 public void reset(long uptime, long realtime) {
582 if (!mRunning) {
583 mPastUptime = 0;
584 mPastRealtime = 0;
585 } else {
586 mUptimeStart = uptime;
587 mRealtimeStart = realtime;
588 mUnpluggedUptime = getUptime(uptime);
589 mUnpluggedRealtime = getRealtime(realtime);
590 }
591 }
592
593 public long computeUptime(long curTime, int which) {
594 switch (which) {
595 case STATS_SINCE_CHARGED:
596 return mUptime + getUptime(curTime);
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800597 case STATS_CURRENT:
598 return getUptime(curTime);
599 case STATS_SINCE_UNPLUGGED:
600 return getUptime(curTime) - mUnpluggedUptime;
601 }
602 return 0;
603 }
604
605 public long computeRealtime(long curTime, int which) {
606 switch (which) {
607 case STATS_SINCE_CHARGED:
608 return mRealtime + getRealtime(curTime);
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800609 case STATS_CURRENT:
610 return getRealtime(curTime);
611 case STATS_SINCE_UNPLUGGED:
612 return getRealtime(curTime) - mUnpluggedRealtime;
613 }
614 return 0;
615 }
616
617 public long getUptime(long curTime) {
618 long time = mPastUptime;
619 if (mRunning) {
620 time += curTime - mUptimeStart;
621 }
622 return time;
623 }
624
625 public long getRealtime(long curTime) {
626 long time = mPastRealtime;
627 if (mRunning) {
628 time += curTime - mRealtimeStart;
629 }
630 return time;
631 }
632
633 public long getUptimeStart() {
634 return mUptimeStart;
635 }
636
637 public long getRealtimeStart() {
638 return mRealtimeStart;
639 }
640
641 public boolean isRunning() {
642 return mRunning;
643 }
644
645 public boolean setRunning(boolean running, long uptime, long realtime) {
646 if (mRunning != running) {
647 mRunning = running;
648 if (running) {
649 mUptimeStart = uptime;
650 mRealtimeStart = realtime;
651 long batteryUptime = mUnpluggedUptime = getUptime(uptime);
652 long batteryRealtime = mUnpluggedRealtime = getRealtime(realtime);
653
654 for (int i = mObservers.size() - 1; i >= 0; i--) {
655 mObservers.get(i).onTimeStarted(realtime, batteryUptime, batteryRealtime);
656 }
657 } else {
658 mPastUptime += uptime - mUptimeStart;
659 mPastRealtime += realtime - mRealtimeStart;
660
661 long batteryUptime = getUptime(uptime);
662 long batteryRealtime = getRealtime(realtime);
663
664 for (int i = mObservers.size() - 1; i >= 0; i--) {
665 mObservers.get(i).onTimeStopped(realtime, batteryUptime, batteryRealtime);
666 }
667 }
668 return true;
669 }
670 return false;
671 }
672
673 public void readSummaryFromParcel(Parcel in) {
674 mUptime = in.readLong();
675 mRealtime = in.readLong();
676 }
677
678 public void writeSummaryToParcel(Parcel out, long uptime, long realtime) {
679 out.writeLong(computeUptime(uptime, STATS_SINCE_CHARGED));
680 out.writeLong(computeRealtime(realtime, STATS_SINCE_CHARGED));
681 }
682
683 public void readFromParcel(Parcel in) {
684 mRunning = false;
685 mUptime = in.readLong();
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800686 mPastUptime = in.readLong();
687 mUptimeStart = in.readLong();
Dianne Hackbornef640cd2014-03-25 14:41:05 -0700688 mRealtime = in.readLong();
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800689 mPastRealtime = in.readLong();
690 mRealtimeStart = in.readLong();
691 mUnpluggedUptime = in.readLong();
692 mUnpluggedRealtime = in.readLong();
693 }
694
695 public void writeToParcel(Parcel out, long uptime, long realtime) {
696 final long runningUptime = getUptime(uptime);
697 final long runningRealtime = getRealtime(realtime);
698 out.writeLong(mUptime);
699 out.writeLong(runningUptime);
700 out.writeLong(mUptimeStart);
Dianne Hackbornef640cd2014-03-25 14:41:05 -0700701 out.writeLong(mRealtime);
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800702 out.writeLong(runningRealtime);
703 out.writeLong(mRealtimeStart);
704 out.writeLong(mUnpluggedUptime);
705 out.writeLong(mUnpluggedRealtime);
706 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800707 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700708
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800709 /**
Dianne Hackborn617f8772009-03-31 15:04:46 -0700710 * State for keeping track of counting information.
711 */
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800712 public static class Counter extends BatteryStats.Counter implements TimeBaseObs {
Christopher Tate4cee7252010-03-19 14:50:40 -0700713 final AtomicInteger mCount = new AtomicInteger();
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800714 final TimeBase mTimeBase;
Dianne Hackborn617f8772009-03-31 15:04:46 -0700715 int mLoadedCount;
716 int mLastCount;
717 int mUnpluggedCount;
718 int mPluggedCount;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700719
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800720 Counter(TimeBase timeBase, Parcel in) {
721 mTimeBase = timeBase;
Christopher Tate4cee7252010-03-19 14:50:40 -0700722 mPluggedCount = in.readInt();
723 mCount.set(mPluggedCount);
Dianne Hackborn617f8772009-03-31 15:04:46 -0700724 mLoadedCount = in.readInt();
Dianne Hackborn3bee5af82010-07-23 00:22:04 -0700725 mLastCount = 0;
Dianne Hackborn617f8772009-03-31 15:04:46 -0700726 mUnpluggedCount = in.readInt();
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800727 timeBase.add(this);
Dianne Hackborn617f8772009-03-31 15:04:46 -0700728 }
729
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800730 Counter(TimeBase timeBase) {
731 mTimeBase = timeBase;
732 timeBase.add(this);
Dianne Hackborn617f8772009-03-31 15:04:46 -0700733 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700734
Dianne Hackborn617f8772009-03-31 15:04:46 -0700735 public void writeToParcel(Parcel out) {
Christopher Tate4cee7252010-03-19 14:50:40 -0700736 out.writeInt(mCount.get());
Dianne Hackborn617f8772009-03-31 15:04:46 -0700737 out.writeInt(mLoadedCount);
Dianne Hackborn617f8772009-03-31 15:04:46 -0700738 out.writeInt(mUnpluggedCount);
739 }
740
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800741 public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
Christopher Tate4cee7252010-03-19 14:50:40 -0700742 mUnpluggedCount = mPluggedCount;
743 mCount.set(mPluggedCount);
Dianne Hackborn617f8772009-03-31 15:04:46 -0700744 }
745
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800746 public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
Christopher Tate4cee7252010-03-19 14:50:40 -0700747 mPluggedCount = mCount.get();
Dianne Hackborn617f8772009-03-31 15:04:46 -0700748 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700749
Dianne Hackborn617f8772009-03-31 15:04:46 -0700750 /**
751 * Writes a possibly null Counter to a Parcel.
752 *
753 * @param out the Parcel to be written to.
754 * @param counter a Counter, or null.
755 */
756 public static void writeCounterToParcel(Parcel out, Counter counter) {
757 if (counter == null) {
758 out.writeInt(0); // indicates null
759 return;
760 }
761 out.writeInt(1); // indicates non-null
762
763 counter.writeToParcel(out);
764 }
765
766 @Override
Evan Millarc64edde2009-04-18 12:26:32 -0700767 public int getCountLocked(int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -0700768 int val = mCount.get();
769 if (which == STATS_SINCE_UNPLUGGED) {
770 val -= mUnpluggedCount;
771 } else if (which != STATS_SINCE_CHARGED) {
772 val -= mLoadedCount;
Dianne Hackborn617f8772009-03-31 15:04:46 -0700773 }
774
775 return val;
776 }
777
778 public void logState(Printer pw, String prefix) {
Christopher Tate4cee7252010-03-19 14:50:40 -0700779 pw.println(prefix + "mCount=" + mCount.get()
Dianne Hackborn617f8772009-03-31 15:04:46 -0700780 + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
781 + " mUnpluggedCount=" + mUnpluggedCount
782 + " mPluggedCount=" + mPluggedCount);
783 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700784
Christopher Tate4cee7252010-03-19 14:50:40 -0700785 void stepAtomic() {
786 mCount.incrementAndGet();
Dianne Hackborn617f8772009-03-31 15:04:46 -0700787 }
788
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700789 /**
790 * Clear state of this counter.
791 */
792 void reset(boolean detachIfReset) {
793 mCount.set(0);
794 mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
795 if (detachIfReset) {
796 detach();
797 }
798 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700799
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700800 void detach() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800801 mTimeBase.remove(this);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700802 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700803
Dianne Hackborn617f8772009-03-31 15:04:46 -0700804 void writeSummaryFromParcelLocked(Parcel out) {
Christopher Tate4cee7252010-03-19 14:50:40 -0700805 int count = mCount.get();
806 out.writeInt(count);
Dianne Hackborn617f8772009-03-31 15:04:46 -0700807 }
808
809 void readSummaryFromParcelLocked(Parcel in) {
Christopher Tate4cee7252010-03-19 14:50:40 -0700810 mLoadedCount = in.readInt();
811 mCount.set(mLoadedCount);
Dianne Hackborn3bee5af82010-07-23 00:22:04 -0700812 mLastCount = 0;
Christopher Tate4cee7252010-03-19 14:50:40 -0700813 mUnpluggedCount = mPluggedCount = mLoadedCount;
Dianne Hackborn617f8772009-03-31 15:04:46 -0700814 }
815 }
Amith Yamasanie43530a2009-08-21 13:11:37 -0700816
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700817 public static class LongSamplingCounter extends LongCounter implements TimeBaseObs {
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800818 final TimeBase mTimeBase;
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700819 long mCount;
820 long mLoadedCount;
821 long mLastCount;
822 long mUnpluggedCount;
823 long mPluggedCount;
824
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800825 LongSamplingCounter(TimeBase timeBase, Parcel in) {
826 mTimeBase = timeBase;
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700827 mPluggedCount = in.readLong();
828 mCount = mPluggedCount;
829 mLoadedCount = in.readLong();
830 mLastCount = 0;
831 mUnpluggedCount = in.readLong();
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800832 timeBase.add(this);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700833 }
834
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800835 LongSamplingCounter(TimeBase timeBase) {
836 mTimeBase = timeBase;
837 timeBase.add(this);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700838 }
839
840 public void writeToParcel(Parcel out) {
841 out.writeLong(mCount);
842 out.writeLong(mLoadedCount);
843 out.writeLong(mUnpluggedCount);
844 }
845
846 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800847 public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700848 mUnpluggedCount = mPluggedCount;
849 mCount = mPluggedCount;
850 }
851
852 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800853 public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700854 mPluggedCount = mCount;
855 }
856
857 public long getCountLocked(int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -0700858 long val = mCount;
859 if (which == STATS_SINCE_UNPLUGGED) {
860 val -= mUnpluggedCount;
861 } else if (which != STATS_SINCE_CHARGED) {
862 val -= mLoadedCount;
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700863 }
864
865 return val;
866 }
867
Dianne Hackborna1bd7922014-03-21 11:07:11 -0700868 @Override
869 public void logState(Printer pw, String prefix) {
870 pw.println(prefix + "mCount=" + mCount
871 + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
872 + " mUnpluggedCount=" + mUnpluggedCount
873 + " mPluggedCount=" + mPluggedCount);
874 }
875
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700876 void addCountLocked(long count) {
877 mCount += count;
878 }
879
880 /**
881 * Clear state of this counter.
882 */
883 void reset(boolean detachIfReset) {
884 mCount = 0;
885 mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
886 if (detachIfReset) {
887 detach();
888 }
889 }
890
891 void detach() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800892 mTimeBase.remove(this);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -0700893 }
894
895 void writeSummaryFromParcelLocked(Parcel out) {
896 out.writeLong(mCount);
897 }
898
899 void readSummaryFromParcelLocked(Parcel in) {
900 mLoadedCount = in.readLong();
901 mCount = mLoadedCount;
902 mLastCount = 0;
903 mUnpluggedCount = mPluggedCount = mLoadedCount;
904 }
905 }
906
Dianne Hackborn617f8772009-03-31 15:04:46 -0700907 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800908 * State for keeping track of timing information.
909 */
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800910 public static abstract class Timer extends BatteryStats.Timer implements TimeBaseObs {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800911 final int mType;
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800912 final TimeBase mTimeBase;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700913
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800914 int mCount;
915 int mLoadedCount;
916 int mLastCount;
917 int mUnpluggedCount;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700918
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800919 // Times are in microseconds for better accuracy when dividing by the
920 // lock count, and are in "battery realtime" units.
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700921
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800922 /**
923 * The total time we have accumulated since the start of the original
924 * boot, to the last time something interesting happened in the
925 * current run.
926 */
927 long mTotalTime;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700928
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800929 /**
930 * The total time we loaded for the previous runs. Subtract this from
931 * mTotalTime to find the time for the current run of the system.
932 */
933 long mLoadedTime;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700934
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800935 /**
936 * The run time of the last run of the system, as loaded from the
937 * saved data.
938 */
939 long mLastTime;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700940
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800941 /**
942 * The value of mTotalTime when unplug() was last called. Subtract
943 * this from mTotalTime to find the time since the last unplug from
944 * power.
945 */
946 long mUnpluggedTime;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700947
Amith Yamasani244fa5c2009-05-22 14:36:07 -0700948 /**
Adam Lesinskie08af192015-03-25 16:42:59 -0700949 * The total time this timer has been running until the latest mark has been set.
950 * Subtract this from mTotalTime to get the time spent running since the mark was set.
951 */
952 long mTimeBeforeMark;
953
954 /**
Amith Yamasani244fa5c2009-05-22 14:36:07 -0700955 * Constructs from a parcel.
956 * @param type
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800957 * @param timeBase
Amith Yamasani244fa5c2009-05-22 14:36:07 -0700958 * @param in
959 */
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800960 Timer(int type, TimeBase timeBase, Parcel in) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800961 mType = type;
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800962 mTimeBase = timeBase;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700963
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800964 mCount = in.readInt();
965 mLoadedCount = in.readInt();
Dianne Hackborn3bee5af82010-07-23 00:22:04 -0700966 mLastCount = 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800967 mUnpluggedCount = in.readInt();
968 mTotalTime = in.readLong();
969 mLoadedTime = in.readLong();
Dianne Hackborn3bee5af82010-07-23 00:22:04 -0700970 mLastTime = 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800971 mUnpluggedTime = in.readLong();
Adam Lesinskie08af192015-03-25 16:42:59 -0700972 mTimeBeforeMark = in.readLong();
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800973 timeBase.add(this);
Dianne Hackborn29325132014-05-21 15:01:03 -0700974 if (DEBUG) Log.i(TAG, "**** READ TIMER #" + mType + ": mTotalTime=" + mTotalTime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800975 }
976
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800977 Timer(int type, TimeBase timeBase) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800978 mType = type;
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800979 mTimeBase = timeBase;
980 timeBase.add(this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800981 }
Evan Millarc64edde2009-04-18 12:26:32 -0700982
983 protected abstract long computeRunTimeLocked(long curBatteryRealtime);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700984
Evan Millarc64edde2009-04-18 12:26:32 -0700985 protected abstract int computeCurrentCountLocked();
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700986
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700987 /**
988 * Clear state of this timer. Returns true if the timer is inactive
989 * so can be completely dropped.
990 */
Dianne Hackborn97ae5382014-03-05 16:43:25 -0800991 boolean reset(boolean detachIfReset) {
Adam Lesinskie08af192015-03-25 16:42:59 -0700992 mTotalTime = mLoadedTime = mLastTime = mTimeBeforeMark = 0;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -0700993 mCount = mLoadedCount = mLastCount = 0;
994 if (detachIfReset) {
995 detach();
996 }
997 return true;
998 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -0700999
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07001000 void detach() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001001 mTimeBase.remove(this);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07001002 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001003
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001004 public void writeToParcel(Parcel out, long elapsedRealtimeUs) {
Dianne Hackborn29325132014-05-21 15:01:03 -07001005 if (DEBUG) Log.i(TAG, "**** WRITING TIMER #" + mType + ": mTotalTime="
1006 + computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs)));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001007 out.writeInt(mCount);
1008 out.writeInt(mLoadedCount);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001009 out.writeInt(mUnpluggedCount);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001010 out.writeLong(computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs)));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001011 out.writeLong(mLoadedTime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001012 out.writeLong(mUnpluggedTime);
Adam Lesinskie08af192015-03-25 16:42:59 -07001013 out.writeLong(mTimeBeforeMark);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001014 }
1015
Adam Lesinskie08af192015-03-25 16:42:59 -07001016 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001017 public void onTimeStarted(long elapsedRealtime, long timeBaseUptime, long baseRealtime) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001018 if (DEBUG && mType < 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001019 Log.v(TAG, "unplug #" + mType + ": realtime=" + baseRealtime
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001020 + " old mUnpluggedTime=" + mUnpluggedTime
1021 + " old mUnpluggedCount=" + mUnpluggedCount);
1022 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001023 mUnpluggedTime = computeRunTimeLocked(baseRealtime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001024 mUnpluggedCount = mCount;
1025 if (DEBUG && mType < 0) {
1026 Log.v(TAG, "unplug #" + mType
1027 + ": new mUnpluggedTime=" + mUnpluggedTime
1028 + " new mUnpluggedCount=" + mUnpluggedCount);
1029 }
1030 }
1031
Adam Lesinskie08af192015-03-25 16:42:59 -07001032 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001033 public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
Evan Millarc64edde2009-04-18 12:26:32 -07001034 if (DEBUG && mType < 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001035 Log.v(TAG, "plug #" + mType + ": realtime=" + baseRealtime
Evan Millarc64edde2009-04-18 12:26:32 -07001036 + " old mTotalTime=" + mTotalTime);
1037 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001038 mTotalTime = computeRunTimeLocked(baseRealtime);
Evan Millarc64edde2009-04-18 12:26:32 -07001039 mCount = computeCurrentCountLocked();
1040 if (DEBUG && mType < 0) {
1041 Log.v(TAG, "plug #" + mType
1042 + ": new mTotalTime=" + mTotalTime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001043 }
1044 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001045
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001046 /**
1047 * Writes a possibly null Timer to a Parcel.
1048 *
1049 * @param out the Parcel to be written to.
1050 * @param timer a Timer, or null.
1051 */
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001052 public static void writeTimerToParcel(Parcel out, Timer timer, long elapsedRealtimeUs) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001053 if (timer == null) {
1054 out.writeInt(0); // indicates null
1055 return;
1056 }
1057 out.writeInt(1); // indicates non-null
1058
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001059 timer.writeToParcel(out, elapsedRealtimeUs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001060 }
1061
1062 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001063 public long getTotalTimeLocked(long elapsedRealtimeUs, int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -07001064 long val = computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs));
1065 if (which == STATS_SINCE_UNPLUGGED) {
1066 val -= mUnpluggedTime;
1067 } else if (which != STATS_SINCE_CHARGED) {
1068 val -= mLoadedTime;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001069 }
1070
1071 return val;
1072 }
1073
1074 @Override
Evan Millarc64edde2009-04-18 12:26:32 -07001075 public int getCountLocked(int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -07001076 int val = computeCurrentCountLocked();
1077 if (which == STATS_SINCE_UNPLUGGED) {
1078 val -= mUnpluggedCount;
1079 } else if (which != STATS_SINCE_CHARGED) {
1080 val -= mLoadedCount;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001081 }
1082
1083 return val;
1084 }
1085
Adam Lesinskie08af192015-03-25 16:42:59 -07001086 @Override
1087 public long getTimeSinceMarkLocked(long elapsedRealtimeUs) {
1088 long val = computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs));
1089 return val - mTimeBeforeMark;
1090 }
1091
1092 @Override
Dianne Hackborn627bba72009-03-24 22:32:56 -07001093 public void logState(Printer pw, String prefix) {
Jeff Sharkey3e013e82013-04-25 14:48:19 -07001094 pw.println(prefix + "mCount=" + mCount
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001095 + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
1096 + " mUnpluggedCount=" + mUnpluggedCount);
Dianne Hackborn627bba72009-03-24 22:32:56 -07001097 pw.println(prefix + "mTotalTime=" + mTotalTime
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001098 + " mLoadedTime=" + mLoadedTime);
Dianne Hackborn627bba72009-03-24 22:32:56 -07001099 pw.println(prefix + "mLastTime=" + mLastTime
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001100 + " mUnpluggedTime=" + mUnpluggedTime);
Evan Millarc64edde2009-04-18 12:26:32 -07001101 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001102
1103
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001104 void writeSummaryFromParcelLocked(Parcel out, long elapsedRealtimeUs) {
1105 long runTime = computeRunTimeLocked(mTimeBase.getRealtime(elapsedRealtimeUs));
1106 out.writeLong(runTime);
Evan Millarc64edde2009-04-18 12:26:32 -07001107 out.writeInt(mCount);
Evan Millarc64edde2009-04-18 12:26:32 -07001108 }
1109
1110 void readSummaryFromParcelLocked(Parcel in) {
1111 // Multiply by 1000 for backwards compatibility
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001112 mTotalTime = mLoadedTime = in.readLong();
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07001113 mLastTime = 0;
Evan Millarc64edde2009-04-18 12:26:32 -07001114 mUnpluggedTime = mTotalTime;
1115 mCount = mLoadedCount = in.readInt();
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07001116 mLastCount = 0;
Evan Millarc64edde2009-04-18 12:26:32 -07001117 mUnpluggedCount = mCount;
Adam Lesinskie08af192015-03-25 16:42:59 -07001118
1119 // When reading the summary, we set the mark to be the latest information.
1120 mTimeBeforeMark = mTotalTime;
Evan Millarc64edde2009-04-18 12:26:32 -07001121 }
1122 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001123
Evan Millarc64edde2009-04-18 12:26:32 -07001124 public static final class SamplingTimer extends Timer {
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001125
Evan Millarc64edde2009-04-18 12:26:32 -07001126 /**
1127 * The most recent reported count from /proc/wakelocks.
1128 */
1129 int mCurrentReportedCount;
1130
1131 /**
1132 * The reported count from /proc/wakelocks when unplug() was last
1133 * called.
1134 */
1135 int mUnpluggedReportedCount;
1136
1137 /**
1138 * The most recent reported total_time from /proc/wakelocks.
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001139 */
Evan Millarc64edde2009-04-18 12:26:32 -07001140 long mCurrentReportedTotalTime;
1141
1142
1143 /**
1144 * The reported total_time from /proc/wakelocks when unplug() was last
1145 * called.
1146 */
1147 long mUnpluggedReportedTotalTime;
1148
1149 /**
1150 * Whether we are currently in a discharge cycle.
1151 */
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001152 boolean mTimeBaseRunning;
Evan Millarc64edde2009-04-18 12:26:32 -07001153
1154 /**
1155 * Whether we are currently recording reported values.
1156 */
1157 boolean mTrackingReportedValues;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001158
Evan Millarc64edde2009-04-18 12:26:32 -07001159 /*
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001160 * A sequence counter, incremented once for each update of the stats.
Evan Millarc64edde2009-04-18 12:26:32 -07001161 */
1162 int mUpdateVersion;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001163
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001164 SamplingTimer(TimeBase timeBase, Parcel in) {
1165 super(0, timeBase, in);
Evan Millarc64edde2009-04-18 12:26:32 -07001166 mCurrentReportedCount = in.readInt();
1167 mUnpluggedReportedCount = in.readInt();
1168 mCurrentReportedTotalTime = in.readLong();
1169 mUnpluggedReportedTotalTime = in.readLong();
1170 mTrackingReportedValues = in.readInt() == 1;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001171 mTimeBaseRunning = timeBase.isRunning();
Evan Millarc64edde2009-04-18 12:26:32 -07001172 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001173
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001174 SamplingTimer(TimeBase timeBase, boolean trackReportedValues) {
1175 super(0, timeBase);
Evan Millarc64edde2009-04-18 12:26:32 -07001176 mTrackingReportedValues = trackReportedValues;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001177 mTimeBaseRunning = timeBase.isRunning();
Evan Millarc64edde2009-04-18 12:26:32 -07001178 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001179
Evan Millarc64edde2009-04-18 12:26:32 -07001180 public void setStale() {
1181 mTrackingReportedValues = false;
1182 mUnpluggedReportedTotalTime = 0;
1183 mUnpluggedReportedCount = 0;
1184 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001185
Evan Millarc64edde2009-04-18 12:26:32 -07001186 public void setUpdateVersion(int version) {
1187 mUpdateVersion = version;
1188 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001189
Evan Millarc64edde2009-04-18 12:26:32 -07001190 public int getUpdateVersion() {
1191 return mUpdateVersion;
1192 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001193
Evan Millarc64edde2009-04-18 12:26:32 -07001194 public void updateCurrentReportedCount(int count) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001195 if (mTimeBaseRunning && mUnpluggedReportedCount == 0) {
Evan Millarc64edde2009-04-18 12:26:32 -07001196 // Updating the reported value for the first time.
1197 mUnpluggedReportedCount = count;
1198 // If we are receiving an update update mTrackingReportedValues;
1199 mTrackingReportedValues = true;
1200 }
1201 mCurrentReportedCount = count;
1202 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001203
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07001204 public void addCurrentReportedCount(int delta) {
1205 updateCurrentReportedCount(mCurrentReportedCount + delta);
1206 }
1207
Evan Millarc64edde2009-04-18 12:26:32 -07001208 public void updateCurrentReportedTotalTime(long totalTime) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001209 if (mTimeBaseRunning && mUnpluggedReportedTotalTime == 0) {
Evan Millarc64edde2009-04-18 12:26:32 -07001210 // Updating the reported value for the first time.
1211 mUnpluggedReportedTotalTime = totalTime;
1212 // If we are receiving an update update mTrackingReportedValues;
1213 mTrackingReportedValues = true;
1214 }
1215 mCurrentReportedTotalTime = totalTime;
1216 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001217
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07001218 public void addCurrentReportedTotalTime(long delta) {
1219 updateCurrentReportedTotalTime(mCurrentReportedTotalTime + delta);
1220 }
1221
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001222 public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
1223 super.onTimeStarted(elapsedRealtime, baseUptime, baseRealtime);
Evan Millarc64edde2009-04-18 12:26:32 -07001224 if (mTrackingReportedValues) {
1225 mUnpluggedReportedTotalTime = mCurrentReportedTotalTime;
1226 mUnpluggedReportedCount = mCurrentReportedCount;
1227 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001228 mTimeBaseRunning = true;
Evan Millarc64edde2009-04-18 12:26:32 -07001229 }
1230
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001231 public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
1232 super.onTimeStopped(elapsedRealtime, baseUptime, baseRealtime);
1233 mTimeBaseRunning = false;
Evan Millarc64edde2009-04-18 12:26:32 -07001234 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001235
Evan Millarc64edde2009-04-18 12:26:32 -07001236 public void logState(Printer pw, String prefix) {
1237 super.logState(pw, prefix);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001238 pw.println(prefix + "mCurrentReportedCount=" + mCurrentReportedCount
Evan Millarc64edde2009-04-18 12:26:32 -07001239 + " mUnpluggedReportedCount=" + mUnpluggedReportedCount
1240 + " mCurrentReportedTotalTime=" + mCurrentReportedTotalTime
1241 + " mUnpluggedReportedTotalTime=" + mUnpluggedReportedTotalTime);
1242 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001243
Evan Millarc64edde2009-04-18 12:26:32 -07001244 protected long computeRunTimeLocked(long curBatteryRealtime) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001245 return mTotalTime + (mTimeBaseRunning && mTrackingReportedValues
Evan Millarc64edde2009-04-18 12:26:32 -07001246 ? mCurrentReportedTotalTime - mUnpluggedReportedTotalTime : 0);
1247 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001248
Evan Millarc64edde2009-04-18 12:26:32 -07001249 protected int computeCurrentCountLocked() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001250 return mCount + (mTimeBaseRunning && mTrackingReportedValues
Evan Millarc64edde2009-04-18 12:26:32 -07001251 ? mCurrentReportedCount - mUnpluggedReportedCount : 0);
1252 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001253
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001254 public void writeToParcel(Parcel out, long elapsedRealtimeUs) {
1255 super.writeToParcel(out, elapsedRealtimeUs);
Evan Millarc64edde2009-04-18 12:26:32 -07001256 out.writeInt(mCurrentReportedCount);
1257 out.writeInt(mUnpluggedReportedCount);
1258 out.writeLong(mCurrentReportedTotalTime);
1259 out.writeLong(mUnpluggedReportedTotalTime);
1260 out.writeInt(mTrackingReportedValues ? 1 : 0);
1261 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001262
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001263 boolean reset(boolean detachIfReset) {
1264 super.reset(detachIfReset);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07001265 setStale();
1266 return true;
1267 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001268
Evan Millarc64edde2009-04-18 12:26:32 -07001269 void writeSummaryFromParcelLocked(Parcel out, long batteryRealtime) {
1270 super.writeSummaryFromParcelLocked(out, batteryRealtime);
1271 out.writeLong(mCurrentReportedTotalTime);
1272 out.writeInt(mCurrentReportedCount);
1273 out.writeInt(mTrackingReportedValues ? 1 : 0);
1274 }
1275
1276 void readSummaryFromParcelLocked(Parcel in) {
1277 super.readSummaryFromParcelLocked(in);
1278 mUnpluggedReportedTotalTime = mCurrentReportedTotalTime = in.readLong();
1279 mUnpluggedReportedCount = mCurrentReportedCount = in.readInt();
1280 mTrackingReportedValues = in.readInt() == 1;
1281 }
1282 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001283
Evan Millarc64edde2009-04-18 12:26:32 -07001284 /**
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001285 * A timer that increments in batches. It does not run for durations, but just jumps
1286 * for a pre-determined amount.
1287 */
1288 public static final class BatchTimer extends Timer {
1289 final Uid mUid;
1290
1291 /**
1292 * The last time at which we updated the timer. This is in elapsed realtime microseconds.
1293 */
1294 long mLastAddedTime;
1295
1296 /**
1297 * The last duration that we added to the timer. This is in microseconds.
1298 */
1299 long mLastAddedDuration;
1300
1301 /**
1302 * Whether we are currently in a discharge cycle.
1303 */
1304 boolean mInDischarge;
1305
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001306 BatchTimer(Uid uid, int type, TimeBase timeBase, Parcel in) {
1307 super(type, timeBase, in);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001308 mUid = uid;
1309 mLastAddedTime = in.readLong();
1310 mLastAddedDuration = in.readLong();
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001311 mInDischarge = timeBase.isRunning();
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001312 }
1313
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001314 BatchTimer(Uid uid, int type, TimeBase timeBase) {
1315 super(type, timeBase);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001316 mUid = uid;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001317 mInDischarge = timeBase.isRunning();
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001318 }
1319
1320 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001321 public void writeToParcel(Parcel out, long elapsedRealtimeUs) {
1322 super.writeToParcel(out, elapsedRealtimeUs);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001323 out.writeLong(mLastAddedTime);
1324 out.writeLong(mLastAddedDuration);
1325 }
1326
1327 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001328 public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001329 recomputeLastDuration(SystemClock.elapsedRealtime() * 1000, false);
1330 mInDischarge = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001331 super.onTimeStopped(elapsedRealtime, baseUptime, baseRealtime);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001332 }
1333
1334 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001335 public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001336 recomputeLastDuration(elapsedRealtime, false);
1337 mInDischarge = true;
1338 // If we are still within the last added duration, then re-added whatever remains.
1339 if (mLastAddedTime == elapsedRealtime) {
1340 mTotalTime += mLastAddedDuration;
1341 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001342 super.onTimeStarted(elapsedRealtime, baseUptime, baseRealtime);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001343 }
1344
1345 @Override
1346 public void logState(Printer pw, String prefix) {
1347 super.logState(pw, prefix);
1348 pw.println(prefix + "mLastAddedTime=" + mLastAddedTime
1349 + " mLastAddedDuration=" + mLastAddedDuration);
1350 }
1351
1352 private long computeOverage(long curTime) {
1353 if (mLastAddedTime > 0) {
1354 return mLastTime + mLastAddedDuration - curTime;
1355 }
1356 return 0;
1357 }
1358
1359 private void recomputeLastDuration(long curTime, boolean abort) {
1360 final long overage = computeOverage(curTime);
1361 if (overage > 0) {
1362 // Aborting before the duration ran out -- roll back the remaining
1363 // duration. Only do this if currently discharging; otherwise we didn't
1364 // actually add the time.
1365 if (mInDischarge) {
1366 mTotalTime -= overage;
1367 }
1368 if (abort) {
1369 mLastAddedTime = 0;
1370 } else {
1371 mLastAddedTime = curTime;
1372 mLastAddedDuration -= overage;
1373 }
1374 }
1375 }
1376
1377 public void addDuration(BatteryStatsImpl stats, long durationMillis) {
1378 final long now = SystemClock.elapsedRealtime() * 1000;
1379 recomputeLastDuration(now, true);
1380 mLastAddedTime = now;
1381 mLastAddedDuration = durationMillis * 1000;
1382 if (mInDischarge) {
1383 mTotalTime += mLastAddedDuration;
1384 mCount++;
1385 }
1386 }
1387
1388 public void abortLastDuration(BatteryStatsImpl stats) {
1389 final long now = SystemClock.elapsedRealtime() * 1000;
1390 recomputeLastDuration(now, true);
1391 }
1392
1393 @Override
1394 protected int computeCurrentCountLocked() {
1395 return mCount;
1396 }
1397
1398 @Override
1399 protected long computeRunTimeLocked(long curBatteryRealtime) {
1400 final long overage = computeOverage(SystemClock.elapsedRealtime() * 1000);
1401 if (overage > 0) {
1402 return mTotalTime = overage;
1403 }
1404 return mTotalTime;
1405 }
1406
1407 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001408 boolean reset(boolean detachIfReset) {
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001409 final long now = SystemClock.elapsedRealtime() * 1000;
1410 recomputeLastDuration(now, true);
1411 boolean stillActive = mLastAddedTime == now;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001412 super.reset(!stillActive && detachIfReset);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001413 return !stillActive;
1414 }
1415 }
1416
1417 /**
Evan Millarc64edde2009-04-18 12:26:32 -07001418 * State for keeping track of timing information.
1419 */
1420 public static final class StopwatchTimer extends Timer {
Dianne Hackborn0d903a82010-09-07 23:51:03 -07001421 final Uid mUid;
Evan Millarc64edde2009-04-18 12:26:32 -07001422 final ArrayList<StopwatchTimer> mTimerPool;
Dianne Hackborn0d903a82010-09-07 23:51:03 -07001423
Evan Millarc64edde2009-04-18 12:26:32 -07001424 int mNesting;
1425
Evan Millarc64edde2009-04-18 12:26:32 -07001426 /**
1427 * The last time at which we updated the timer. If mNesting is > 0,
1428 * subtract this from the current battery time to find the amount of
1429 * time we have been running since we last computed an update.
1430 */
1431 long mUpdateTime;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001432
Evan Millarc64edde2009-04-18 12:26:32 -07001433 /**
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07001434 * The total time at which the timer was acquired, to determine if it
Evan Millarc64edde2009-04-18 12:26:32 -07001435 * was actually held for an interesting duration.
1436 */
1437 long mAcquireTime;
Evan Millarc64edde2009-04-18 12:26:32 -07001438
Amith Yamasanif37447b2009-10-08 18:28:01 -07001439 long mTimeout;
1440
Dianne Hackborn0d903a82010-09-07 23:51:03 -07001441 /**
1442 * For partial wake locks, keep track of whether we are in the list
1443 * to consume CPU cycles.
1444 */
1445 boolean mInList;
1446
1447 StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001448 TimeBase timeBase, Parcel in) {
1449 super(type, timeBase, in);
Dianne Hackborn0d903a82010-09-07 23:51:03 -07001450 mUid = uid;
Evan Millarc64edde2009-04-18 12:26:32 -07001451 mTimerPool = timerPool;
1452 mUpdateTime = in.readLong();
1453 }
1454
Dianne Hackborn0d903a82010-09-07 23:51:03 -07001455 StopwatchTimer(Uid uid, int type, ArrayList<StopwatchTimer> timerPool,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001456 TimeBase timeBase) {
1457 super(type, timeBase);
Dianne Hackborn0d903a82010-09-07 23:51:03 -07001458 mUid = uid;
Evan Millarc64edde2009-04-18 12:26:32 -07001459 mTimerPool = timerPool;
1460 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001461
Amith Yamasanif37447b2009-10-08 18:28:01 -07001462 void setTimeout(long timeout) {
1463 mTimeout = timeout;
1464 }
1465
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001466 public void writeToParcel(Parcel out, long elapsedRealtimeUs) {
1467 super.writeToParcel(out, elapsedRealtimeUs);
Evan Millarc64edde2009-04-18 12:26:32 -07001468 out.writeLong(mUpdateTime);
1469 }
1470
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001471 public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
Evan Millarc64edde2009-04-18 12:26:32 -07001472 if (mNesting > 0) {
1473 if (DEBUG && mType < 0) {
1474 Log.v(TAG, "old mUpdateTime=" + mUpdateTime);
1475 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001476 super.onTimeStopped(elapsedRealtime, baseUptime, baseRealtime);
1477 mUpdateTime = baseRealtime;
Evan Millarc64edde2009-04-18 12:26:32 -07001478 if (DEBUG && mType < 0) {
1479 Log.v(TAG, "new mUpdateTime=" + mUpdateTime);
1480 }
1481 }
1482 }
1483
1484 public void logState(Printer pw, String prefix) {
1485 super.logState(pw, prefix);
Jeff Sharkey3e013e82013-04-25 14:48:19 -07001486 pw.println(prefix + "mNesting=" + mNesting + " mUpdateTime=" + mUpdateTime
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001487 + " mAcquireTime=" + mAcquireTime);
1488 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001489
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001490 void startRunningLocked(long elapsedRealtimeMs) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001491 if (mNesting++ == 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001492 final long batteryRealtime = mTimeBase.getRealtime(elapsedRealtimeMs * 1000);
Dianne Hackbornd45665b2014-02-26 12:35:32 -08001493 mUpdateTime = batteryRealtime;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001494 if (mTimerPool != null) {
1495 // Accumulate time to all currently active timers before adding
1496 // this new one to the pool.
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001497 refreshTimersLocked(batteryRealtime, mTimerPool, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001498 // Add this timer to the active pool
1499 mTimerPool.add(this);
1500 }
1501 // Increment the count
1502 mCount++;
1503 mAcquireTime = mTotalTime;
1504 if (DEBUG && mType < 0) {
1505 Log.v(TAG, "start #" + mType + ": mUpdateTime=" + mUpdateTime
1506 + " mTotalTime=" + mTotalTime + " mCount=" + mCount
1507 + " mAcquireTime=" + mAcquireTime);
1508 }
1509 }
1510 }
1511
Amith Yamasani32dbefd2009-06-19 09:21:17 -07001512 boolean isRunningLocked() {
1513 return mNesting > 0;
1514 }
1515
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001516 void stopRunningLocked(long elapsedRealtimeMs) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001517 // Ignore attempt to stop a timer that isn't running
1518 if (mNesting == 0) {
1519 return;
1520 }
1521 if (--mNesting == 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001522 final long batteryRealtime = mTimeBase.getRealtime(elapsedRealtimeMs * 1000);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001523 if (mTimerPool != null) {
1524 // Accumulate time to all active counters, scaled by the total
1525 // active in the pool, before taking this one out of the pool.
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001526 refreshTimersLocked(batteryRealtime, mTimerPool, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001527 // Remove this timer from the active pool
1528 mTimerPool.remove(this);
1529 } else {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001530 mNesting = 1;
1531 mTotalTime = computeRunTimeLocked(batteryRealtime);
1532 mNesting = 0;
1533 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001534
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001535 if (DEBUG && mType < 0) {
1536 Log.v(TAG, "stop #" + mType + ": mUpdateTime=" + mUpdateTime
1537 + " mTotalTime=" + mTotalTime + " mCount=" + mCount
1538 + " mAcquireTime=" + mAcquireTime);
1539 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001540
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001541 if (mTotalTime == mAcquireTime) {
1542 // If there was no change in the time, then discard this
1543 // count. A somewhat cheezy strategy, but hey.
1544 mCount--;
1545 }
1546 }
1547 }
1548
Dianne Hackborn10eaa852014-07-22 22:54:55 -07001549 void stopAllRunningLocked(long elapsedRealtimeMs) {
1550 if (mNesting > 0) {
1551 mNesting = 1;
1552 stopRunningLocked(elapsedRealtimeMs);
1553 }
1554 }
1555
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001556 // Update the total time for all other running Timers with the same type as this Timer
1557 // due to a change in timer count
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001558 private static long refreshTimersLocked(long batteryRealtime,
1559 final ArrayList<StopwatchTimer> pool, StopwatchTimer self) {
Dianne Hackbornd45665b2014-02-26 12:35:32 -08001560 long selfTime = 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001561 final int N = pool.size();
1562 for (int i=N-1; i>= 0; i--) {
Evan Millarc64edde2009-04-18 12:26:32 -07001563 final StopwatchTimer t = pool.get(i);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001564 long heldTime = batteryRealtime - t.mUpdateTime;
1565 if (heldTime > 0) {
Dianne Hackbornd45665b2014-02-26 12:35:32 -08001566 final long myTime = heldTime / N;
1567 if (t == self) {
1568 selfTime = myTime;
1569 }
1570 t.mTotalTime += myTime;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001571 }
1572 t.mUpdateTime = batteryRealtime;
1573 }
Dianne Hackbornd45665b2014-02-26 12:35:32 -08001574 return selfTime;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001575 }
1576
Evan Millarc64edde2009-04-18 12:26:32 -07001577 @Override
1578 protected long computeRunTimeLocked(long curBatteryRealtime) {
Amith Yamasanif37447b2009-10-08 18:28:01 -07001579 if (mTimeout > 0 && curBatteryRealtime > mUpdateTime + mTimeout) {
1580 curBatteryRealtime = mUpdateTime + mTimeout;
1581 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001582 return mTotalTime + (mNesting > 0
1583 ? (curBatteryRealtime - mUpdateTime)
1584 / (mTimerPool != null ? mTimerPool.size() : 1)
1585 : 0);
1586 }
1587
Evan Millarc64edde2009-04-18 12:26:32 -07001588 @Override
1589 protected int computeCurrentCountLocked() {
1590 return mCount;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001591 }
1592
Adam Lesinskie08af192015-03-25 16:42:59 -07001593 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001594 boolean reset(boolean detachIfReset) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07001595 boolean canDetach = mNesting <= 0;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001596 super.reset(canDetach && detachIfReset);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07001597 if (mNesting > 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001598 mUpdateTime = mTimeBase.getRealtime(SystemClock.elapsedRealtime() * 1000);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07001599 }
1600 mAcquireTime = mTotalTime;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07001601 return canDetach;
1602 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001603
Adam Lesinskie08af192015-03-25 16:42:59 -07001604 @Override
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07001605 void detach() {
1606 super.detach();
1607 if (mTimerPool != null) {
1608 mTimerPool.remove(this);
1609 }
1610 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001611
Adam Lesinskie08af192015-03-25 16:42:59 -07001612 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001613 void readSummaryFromParcelLocked(Parcel in) {
Evan Millarc64edde2009-04-18 12:26:32 -07001614 super.readSummaryFromParcelLocked(in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001615 mNesting = 0;
1616 }
Adam Lesinskie08af192015-03-25 16:42:59 -07001617
1618 /**
1619 * Set the mark so that we can query later for the total time the timer has
1620 * accumulated since this point. The timer can be running or not.
1621 *
1622 * @param elapsedRealtimeMs the current elapsed realtime in milliseconds.
1623 */
1624 public void setMark(long elapsedRealtimeMs) {
1625 final long batteryRealtime = mTimeBase.getRealtime(elapsedRealtimeMs * 1000);
1626 if (mNesting > 0) {
1627 // We are running.
1628 if (mTimerPool != null) {
1629 refreshTimersLocked(batteryRealtime, mTimerPool, this);
1630 } else {
1631 mTotalTime += batteryRealtime - mUpdateTime;
1632 mUpdateTime = batteryRealtime;
1633 }
1634 }
1635 mTimeBeforeMark = mTotalTime;
1636 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001637 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001638
Dianne Hackbornd953c532014-08-16 18:17:38 -07001639 public abstract class OverflowArrayMap<T> {
1640 private static final String OVERFLOW_NAME = "*overflow*";
1641
1642 final ArrayMap<String, T> mMap = new ArrayMap<>();
1643 T mCurOverflow;
1644 ArrayMap<String, MutableInt> mActiveOverflow;
1645
1646 public OverflowArrayMap() {
1647 }
1648
1649 public ArrayMap<String, T> getMap() {
1650 return mMap;
1651 }
1652
1653 public void clear() {
1654 mMap.clear();
1655 mCurOverflow = null;
1656 mActiveOverflow = null;
1657 }
1658
1659 public void add(String name, T obj) {
1660 mMap.put(name, obj);
1661 if (OVERFLOW_NAME.equals(name)) {
1662 mCurOverflow = obj;
1663 }
1664 }
1665
1666 public void cleanup() {
1667 if (mActiveOverflow != null) {
1668 if (mActiveOverflow.size() == 0) {
1669 mActiveOverflow = null;
1670 }
1671 }
1672 if (mActiveOverflow == null) {
1673 // There is no currently active overflow, so we should no longer have
1674 // an overflow entry.
1675 if (mMap.containsKey(OVERFLOW_NAME)) {
1676 Slog.wtf(TAG, "Cleaning up with no active overflow, but have overflow entry "
1677 + mMap.get(OVERFLOW_NAME));
1678 mMap.remove(OVERFLOW_NAME);
1679 }
1680 mCurOverflow = null;
1681 } else {
1682 // There is currently active overflow, so we should still have an overflow entry.
1683 if (mCurOverflow == null || !mMap.containsKey(OVERFLOW_NAME)) {
1684 Slog.wtf(TAG, "Cleaning up with active overflow, but no overflow entry: cur="
1685 + mCurOverflow + " map=" + mMap.get(OVERFLOW_NAME));
1686 }
1687 }
1688 }
1689
1690 public T startObject(String name) {
1691 T obj = mMap.get(name);
1692 if (obj != null) {
1693 return obj;
1694 }
1695
1696 // No object exists for the given name, but do we currently have it
1697 // running as part of the overflow?
1698 if (mActiveOverflow != null) {
1699 MutableInt over = mActiveOverflow.get(name);
1700 if (over != null) {
1701 // We are already actively counting this name in the overflow object.
1702 obj = mCurOverflow;
1703 if (obj == null) {
1704 // Shouldn't be here, but we'll try to recover.
1705 Slog.wtf(TAG, "Have active overflow " + name + " but null overflow");
1706 obj = mCurOverflow = instantiateObject();
1707 mMap.put(OVERFLOW_NAME, obj);
1708 }
1709 over.value++;
1710 return obj;
1711 }
1712 }
1713
1714 // No object exists for given name nor in the overflow; we need to make
1715 // a new one.
1716 final int N = mMap.size();
1717 if (N >= MAX_WAKELOCKS_PER_UID) {
1718 // Went over the limit on number of objects to track; this one goes
1719 // in to the overflow.
1720 obj = mCurOverflow;
1721 if (obj == null) {
1722 // Need to start overflow now...
1723 obj = mCurOverflow = instantiateObject();
1724 mMap.put(OVERFLOW_NAME, obj);
1725 }
1726 if (mActiveOverflow == null) {
1727 mActiveOverflow = new ArrayMap<>();
1728 }
1729 mActiveOverflow.put(name, new MutableInt(1));
1730 return obj;
1731 }
1732
1733 // Normal case where we just need to make a new object.
1734 obj = instantiateObject();
1735 mMap.put(name, obj);
1736 return obj;
1737 }
1738
1739 public T stopObject(String name) {
1740 T obj = mMap.get(name);
1741 if (obj != null) {
1742 return obj;
1743 }
1744
1745 // No object exists for the given name, but do we currently have it
1746 // running as part of the overflow?
1747 if (mActiveOverflow != null) {
1748 MutableInt over = mActiveOverflow.get(name);
1749 if (over != null) {
1750 // We are already actively counting this name in the overflow object.
1751 obj = mCurOverflow;
1752 if (obj != null) {
1753 over.value--;
1754 if (over.value <= 0) {
1755 mActiveOverflow.remove(name);
1756 }
1757 return obj;
1758 }
1759 }
1760 }
1761
1762 // Huh, they are stopping an active operation but we can't find one!
1763 // That's not good.
1764 Slog.wtf(TAG, "Unable to find object for " + name + " mapsize="
1765 + mMap.size() + " activeoverflow=" + mActiveOverflow
1766 + " curoverflow=" + mCurOverflow);
1767 return null;
1768 }
1769
1770 public abstract T instantiateObject();
1771 }
1772
Dianne Hackborna1bd7922014-03-21 11:07:11 -07001773 /*
1774 * Get the wakeup reason counter, and create a new one if one
1775 * doesn't already exist.
1776 */
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07001777 public SamplingTimer getWakeupReasonTimerLocked(String name) {
1778 SamplingTimer timer = mWakeupReasonStats.get(name);
1779 if (timer == null) {
1780 timer = new SamplingTimer(mOnBatteryTimeBase, true);
1781 mWakeupReasonStats.put(name, timer);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07001782 }
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07001783 return timer;
Dianne Hackborna1bd7922014-03-21 11:07:11 -07001784 }
1785
Evan Millarc64edde2009-04-18 12:26:32 -07001786 /*
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07001787 * Get the KernelWakelockTimer associated with name, and create a new one if one
Evan Millarc64edde2009-04-18 12:26:32 -07001788 * doesn't already exist.
1789 */
1790 public SamplingTimer getKernelWakelockTimerLocked(String name) {
1791 SamplingTimer kwlt = mKernelWakelockStats.get(name);
1792 if (kwlt == null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08001793 kwlt = new SamplingTimer(mOnBatteryScreenOffTimeBase, true /* track reported values */);
Evan Millarc64edde2009-04-18 12:26:32 -07001794 mKernelWakelockStats.put(name, kwlt);
1795 }
1796 return kwlt;
1797 }
Amith Yamasani3718aaa2009-06-09 06:32:35 -07001798
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08001799 private int writeHistoryTag(HistoryTag tag) {
1800 Integer idxObj = mHistoryTagPool.get(tag);
1801 int idx;
1802 if (idxObj != null) {
1803 idx = idxObj;
1804 } else {
1805 idx = mNextHistoryTagIdx;
1806 HistoryTag key = new HistoryTag();
1807 key.setTo(tag);
1808 tag.poolIdx = idx;
1809 mHistoryTagPool.put(key, idx);
1810 mNextHistoryTagIdx++;
1811 mNumHistoryTagChars += key.string.length() + 1;
1812 }
1813 return idx;
1814 }
1815
1816 private void readHistoryTag(int index, HistoryTag tag) {
1817 tag.string = mReadHistoryStrings[index];
1818 tag.uid = mReadHistoryUids[index];
1819 tag.poolIdx = index;
1820 }
1821
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001822 // Part of initial delta int that specifies the time delta.
Dianne Hackborne13c4c02014-02-11 17:18:35 -08001823 static final int DELTA_TIME_MASK = 0x7ffff;
1824 static final int DELTA_TIME_LONG = 0x7ffff; // The delta is a following long
1825 static final int DELTA_TIME_INT = 0x7fffe; // The delta is a following int
1826 static final int DELTA_TIME_ABS = 0x7fffd; // Following is an entire abs update.
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001827 // Flag in delta int: a new battery level int follows.
Dianne Hackborne13c4c02014-02-11 17:18:35 -08001828 static final int DELTA_BATTERY_LEVEL_FLAG = 0x00080000;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001829 // Flag in delta int: a new full state and battery status int follows.
Dianne Hackborne13c4c02014-02-11 17:18:35 -08001830 static final int DELTA_STATE_FLAG = 0x00100000;
1831 // Flag in delta int: a new full state2 int follows.
1832 static final int DELTA_STATE2_FLAG = 0x00200000;
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001833 // Flag in delta int: contains a wakelock or wakeReason tag.
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08001834 static final int DELTA_WAKELOCK_FLAG = 0x00400000;
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08001835 // Flag in delta int: contains an event description.
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08001836 static final int DELTA_EVENT_FLAG = 0x00800000;
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08001837 // These upper bits are the frequently changing state bits.
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08001838 static final int DELTA_STATE_MASK = 0xff000000;
1839
1840 // These are the pieces of battery state that are packed in to the upper bits of
1841 // the state int that have been packed in to the first delta int. They must fit
1842 // in DELTA_STATE_MASK.
1843 static final int STATE_BATTERY_STATUS_MASK = 0x00000007;
1844 static final int STATE_BATTERY_STATUS_SHIFT = 29;
1845 static final int STATE_BATTERY_HEALTH_MASK = 0x00000007;
1846 static final int STATE_BATTERY_HEALTH_SHIFT = 26;
1847 static final int STATE_BATTERY_PLUG_MASK = 0x00000003;
1848 static final int STATE_BATTERY_PLUG_SHIFT = 24;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001849
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08001850 // We use the low bit of the battery state int to indicate that we have full details
1851 // from a battery level change.
1852 static final int BATTERY_DELTA_LEVEL_FLAG = 0x00000001;
1853
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001854 public void writeHistoryDelta(Parcel dest, HistoryItem cur, HistoryItem last) {
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08001855 if (last == null || cur.cmd != HistoryItem.CMD_UPDATE) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001856 dest.writeInt(DELTA_TIME_ABS);
1857 cur.writeToParcel(dest, 0);
1858 return;
1859 }
1860
1861 final long deltaTime = cur.time - last.time;
1862 final int lastBatteryLevelInt = buildBatteryLevelInt(last);
1863 final int lastStateInt = buildStateInt(last);
1864
1865 int deltaTimeToken;
1866 if (deltaTime < 0 || deltaTime > Integer.MAX_VALUE) {
1867 deltaTimeToken = DELTA_TIME_LONG;
1868 } else if (deltaTime >= DELTA_TIME_ABS) {
1869 deltaTimeToken = DELTA_TIME_INT;
1870 } else {
1871 deltaTimeToken = (int)deltaTime;
1872 }
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08001873 int firstToken = deltaTimeToken | (cur.states&DELTA_STATE_MASK);
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08001874 final int includeStepDetails = mLastHistoryStepLevel > cur.batteryLevel
1875 ? BATTERY_DELTA_LEVEL_FLAG : 0;
1876 final boolean computeStepDetails = includeStepDetails != 0
1877 || mLastHistoryStepDetails == null;
1878 final int batteryLevelInt = buildBatteryLevelInt(cur) | includeStepDetails;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001879 final boolean batteryLevelIntChanged = batteryLevelInt != lastBatteryLevelInt;
1880 if (batteryLevelIntChanged) {
1881 firstToken |= DELTA_BATTERY_LEVEL_FLAG;
1882 }
1883 final int stateInt = buildStateInt(cur);
1884 final boolean stateIntChanged = stateInt != lastStateInt;
1885 if (stateIntChanged) {
1886 firstToken |= DELTA_STATE_FLAG;
1887 }
Dianne Hackborna1bd7922014-03-21 11:07:11 -07001888 final boolean state2IntChanged = cur.states2 != last.states2;
1889 if (state2IntChanged) {
1890 firstToken |= DELTA_STATE2_FLAG;
1891 }
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001892 if (cur.wakelockTag != null || cur.wakeReasonTag != null) {
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08001893 firstToken |= DELTA_WAKELOCK_FLAG;
1894 }
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08001895 if (cur.eventCode != HistoryItem.EVENT_NONE) {
1896 firstToken |= DELTA_EVENT_FLAG;
1897 }
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001898 dest.writeInt(firstToken);
1899 if (DEBUG) Slog.i(TAG, "WRITE DELTA: firstToken=0x" + Integer.toHexString(firstToken)
1900 + " deltaTime=" + deltaTime);
1901
1902 if (deltaTimeToken >= DELTA_TIME_INT) {
1903 if (deltaTimeToken == DELTA_TIME_INT) {
1904 if (DEBUG) Slog.i(TAG, "WRITE DELTA: int deltaTime=" + (int)deltaTime);
1905 dest.writeInt((int)deltaTime);
1906 } else {
1907 if (DEBUG) Slog.i(TAG, "WRITE DELTA: long deltaTime=" + deltaTime);
1908 dest.writeLong(deltaTime);
1909 }
1910 }
1911 if (batteryLevelIntChanged) {
1912 dest.writeInt(batteryLevelInt);
1913 if (DEBUG) Slog.i(TAG, "WRITE DELTA: batteryToken=0x"
1914 + Integer.toHexString(batteryLevelInt)
1915 + " batteryLevel=" + cur.batteryLevel
1916 + " batteryTemp=" + cur.batteryTemperature
1917 + " batteryVolt=" + (int)cur.batteryVoltage);
1918 }
1919 if (stateIntChanged) {
1920 dest.writeInt(stateInt);
1921 if (DEBUG) Slog.i(TAG, "WRITE DELTA: stateToken=0x"
1922 + Integer.toHexString(stateInt)
1923 + " batteryStatus=" + cur.batteryStatus
1924 + " batteryHealth=" + cur.batteryHealth
1925 + " batteryPlugType=" + cur.batteryPlugType
1926 + " states=0x" + Integer.toHexString(cur.states));
1927 }
Dianne Hackborna1bd7922014-03-21 11:07:11 -07001928 if (state2IntChanged) {
1929 dest.writeInt(cur.states2);
1930 if (DEBUG) Slog.i(TAG, "WRITE DELTA: states2=0x"
1931 + Integer.toHexString(cur.states2));
1932 }
Dianne Hackbornc51cf032014-03-02 19:08:15 -08001933 if (cur.wakelockTag != null || cur.wakeReasonTag != null) {
1934 int wakeLockIndex;
1935 int wakeReasonIndex;
1936 if (cur.wakelockTag != null) {
1937 wakeLockIndex = writeHistoryTag(cur.wakelockTag);
1938 if (DEBUG) Slog.i(TAG, "WRITE DELTA: wakelockTag=#" + cur.wakelockTag.poolIdx
1939 + " " + cur.wakelockTag.uid + ":" + cur.wakelockTag.string);
1940 } else {
1941 wakeLockIndex = 0xffff;
1942 }
1943 if (cur.wakeReasonTag != null) {
1944 wakeReasonIndex = writeHistoryTag(cur.wakeReasonTag);
1945 if (DEBUG) Slog.i(TAG, "WRITE DELTA: wakeReasonTag=#" + cur.wakeReasonTag.poolIdx
1946 + " " + cur.wakeReasonTag.uid + ":" + cur.wakeReasonTag.string);
1947 } else {
1948 wakeReasonIndex = 0xffff;
1949 }
1950 dest.writeInt((wakeReasonIndex<<16) | wakeLockIndex);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08001951 }
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08001952 if (cur.eventCode != HistoryItem.EVENT_NONE) {
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08001953 int index = writeHistoryTag(cur.eventTag);
1954 int codeAndIndex = (cur.eventCode&0xffff) | (index<<16);
Dianne Hackborn099bc622014-01-22 13:39:16 -08001955 dest.writeInt(codeAndIndex);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08001956 if (DEBUG) Slog.i(TAG, "WRITE DELTA: event=" + cur.eventCode + " tag=#"
1957 + cur.eventTag.poolIdx + " " + cur.eventTag.uid + ":"
1958 + cur.eventTag.string);
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001959 }
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08001960 if (computeStepDetails) {
1961 computeHistoryStepDetails(mCurHistoryStepDetails, mLastHistoryStepDetails);
1962 if (includeStepDetails != 0) {
1963 mCurHistoryStepDetails.writeToParcel(dest);
1964 }
1965 cur.stepDetails = mCurHistoryStepDetails;
1966 mLastHistoryStepDetails = mCurHistoryStepDetails;
1967 } else {
1968 cur.stepDetails = null;
1969 }
1970 if (mLastHistoryStepLevel < cur.batteryLevel) {
1971 mLastHistoryStepDetails = null;
1972 }
1973 mLastHistoryStepLevel = cur.batteryLevel;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001974 }
1975
1976 private int buildBatteryLevelInt(HistoryItem h) {
1977 return ((((int)h.batteryLevel)<<25)&0xfe000000)
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08001978 | ((((int)h.batteryTemperature)<<14)&0x01ff8000)
1979 | ((((int)h.batteryVoltage)<<1)&0x00007fff);
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001980 }
1981
1982 private int buildStateInt(HistoryItem h) {
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08001983 int plugType = 0;
1984 if ((h.batteryPlugType&BatteryManager.BATTERY_PLUGGED_AC) != 0) {
1985 plugType = 1;
1986 } else if ((h.batteryPlugType&BatteryManager.BATTERY_PLUGGED_USB) != 0) {
1987 plugType = 2;
1988 } else if ((h.batteryPlugType&BatteryManager.BATTERY_PLUGGED_WIRELESS) != 0) {
1989 plugType = 3;
1990 }
1991 return ((h.batteryStatus&STATE_BATTERY_STATUS_MASK)<<STATE_BATTERY_STATUS_SHIFT)
1992 | ((h.batteryHealth&STATE_BATTERY_HEALTH_MASK)<<STATE_BATTERY_HEALTH_SHIFT)
1993 | ((plugType&STATE_BATTERY_PLUG_MASK)<<STATE_BATTERY_PLUG_SHIFT)
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08001994 | (h.states&(~DELTA_STATE_MASK));
1995 }
1996
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08001997 private void computeHistoryStepDetails(final HistoryStepDetails out,
1998 final HistoryStepDetails last) {
1999 final HistoryStepDetails tmp = last != null ? mTmpHistoryStepDetails : out;
2000
2001 // Perform a CPU update right after we do this collection, so we have started
2002 // collecting good data for the next step.
2003 requestImmediateCpuUpdate();
2004
2005 if (last == null) {
2006 // We are not generating a delta, so all we need to do is reset the stats
2007 // we will later be doing a delta from.
2008 final int NU = mUidStats.size();
2009 for (int i=0; i<NU; i++) {
2010 final BatteryStatsImpl.Uid uid = mUidStats.valueAt(i);
2011 uid.mLastStepUserTime = uid.mCurStepUserTime;
2012 uid.mLastStepSystemTime = uid.mCurStepSystemTime;
2013 }
2014 mLastStepCpuUserTime = mCurStepCpuUserTime;
2015 mLastStepCpuSystemTime = mCurStepCpuSystemTime;
2016 mLastStepStatUserTime = mCurStepStatUserTime;
2017 mLastStepStatSystemTime = mCurStepStatSystemTime;
2018 mLastStepStatIOWaitTime = mCurStepStatIOWaitTime;
2019 mLastStepStatIrqTime = mCurStepStatIrqTime;
2020 mLastStepStatSoftIrqTime = mCurStepStatSoftIrqTime;
2021 mLastStepStatIdleTime = mCurStepStatIdleTime;
2022 tmp.clear();
2023 return;
2024 }
2025 if (DEBUG) {
2026 Slog.d(TAG, "Step stats last: user=" + mLastStepCpuUserTime + " sys="
2027 + mLastStepStatSystemTime + " io=" + mLastStepStatIOWaitTime
2028 + " irq=" + mLastStepStatIrqTime + " sirq="
2029 + mLastStepStatSoftIrqTime + " idle=" + mLastStepStatIdleTime);
2030 Slog.d(TAG, "Step stats cur: user=" + mCurStepCpuUserTime + " sys="
2031 + mCurStepStatSystemTime + " io=" + mCurStepStatIOWaitTime
2032 + " irq=" + mCurStepStatIrqTime + " sirq="
2033 + mCurStepStatSoftIrqTime + " idle=" + mCurStepStatIdleTime);
2034 }
2035 out.userTime = (int)(mCurStepCpuUserTime - mLastStepCpuUserTime);
2036 out.systemTime = (int)(mCurStepCpuSystemTime - mLastStepCpuSystemTime);
2037 out.statUserTime = (int)(mCurStepStatUserTime - mLastStepStatUserTime);
2038 out.statSystemTime = (int)(mCurStepStatSystemTime - mLastStepStatSystemTime);
2039 out.statIOWaitTime = (int)(mCurStepStatIOWaitTime - mLastStepStatIOWaitTime);
2040 out.statIrqTime = (int)(mCurStepStatIrqTime - mLastStepStatIrqTime);
2041 out.statSoftIrqTime = (int)(mCurStepStatSoftIrqTime - mLastStepStatSoftIrqTime);
2042 out.statIdlTime = (int)(mCurStepStatIdleTime - mLastStepStatIdleTime);
2043 out.appCpuUid1 = out.appCpuUid2 = out.appCpuUid3 = -1;
2044 out.appCpuUTime1 = out.appCpuUTime2 = out.appCpuUTime3 = 0;
2045 out.appCpuSTime1 = out.appCpuSTime2 = out.appCpuSTime3 = 0;
2046 final int NU = mUidStats.size();
2047 for (int i=0; i<NU; i++) {
2048 final BatteryStatsImpl.Uid uid = mUidStats.valueAt(i);
2049 final int totalUTime = (int)(uid.mCurStepUserTime - uid.mLastStepUserTime);
2050 final int totalSTime = (int)(uid.mCurStepSystemTime - uid.mLastStepSystemTime);
2051 final int totalTime = totalUTime + totalSTime;
2052 uid.mLastStepUserTime = uid.mCurStepUserTime;
2053 uid.mLastStepSystemTime = uid.mCurStepSystemTime;
2054 if (totalTime <= (out.appCpuUTime3+out.appCpuSTime3)) {
2055 continue;
2056 }
2057 if (totalTime <= (out.appCpuUTime2+out.appCpuSTime2)) {
2058 out.appCpuUid3 = uid.mUid;
2059 out.appCpuUTime3 = totalUTime;
2060 out.appCpuSTime3 = totalSTime;
2061 } else {
2062 out.appCpuUid3 = out.appCpuUid2;
2063 out.appCpuUTime3 = out.appCpuUTime2;
2064 out.appCpuSTime3 = out.appCpuSTime2;
2065 if (totalTime <= (out.appCpuUTime1+out.appCpuSTime1)) {
2066 out.appCpuUid2 = uid.mUid;
2067 out.appCpuUTime2 = totalUTime;
2068 out.appCpuSTime2 = totalSTime;
2069 } else {
2070 out.appCpuUid2 = out.appCpuUid1;
2071 out.appCpuUTime2 = out.appCpuUTime1;
2072 out.appCpuSTime2 = out.appCpuSTime1;
2073 out.appCpuUid1 = uid.mUid;
2074 out.appCpuUTime1 = totalUTime;
2075 out.appCpuSTime1 = totalSTime;
2076 }
2077 }
2078 }
2079 mLastStepCpuUserTime = mCurStepCpuUserTime;
2080 mLastStepCpuSystemTime = mCurStepCpuSystemTime;
2081 mLastStepStatUserTime = mCurStepStatUserTime;
2082 mLastStepStatSystemTime = mCurStepStatSystemTime;
2083 mLastStepStatIOWaitTime = mCurStepStatIOWaitTime;
2084 mLastStepStatIrqTime = mCurStepStatIrqTime;
2085 mLastStepStatSoftIrqTime = mCurStepStatSoftIrqTime;
2086 mLastStepStatIdleTime = mCurStepStatIdleTime;
2087 }
2088
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002089 public void readHistoryDelta(Parcel src, HistoryItem cur) {
2090 int firstToken = src.readInt();
2091 int deltaTimeToken = firstToken&DELTA_TIME_MASK;
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002092 cur.cmd = HistoryItem.CMD_UPDATE;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002093 cur.numReadInts = 1;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002094 if (DEBUG) Slog.i(TAG, "READ DELTA: firstToken=0x" + Integer.toHexString(firstToken)
2095 + " deltaTimeToken=" + deltaTimeToken);
2096
2097 if (deltaTimeToken < DELTA_TIME_ABS) {
2098 cur.time += deltaTimeToken;
2099 } else if (deltaTimeToken == DELTA_TIME_ABS) {
2100 cur.time = src.readLong();
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002101 cur.numReadInts += 2;
2102 if (DEBUG) Slog.i(TAG, "READ DELTA: ABS time=" + cur.time);
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002103 cur.readFromParcel(src);
2104 return;
2105 } else if (deltaTimeToken == DELTA_TIME_INT) {
2106 int delta = src.readInt();
2107 cur.time += delta;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002108 cur.numReadInts += 1;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002109 if (DEBUG) Slog.i(TAG, "READ DELTA: time delta=" + delta + " new time=" + cur.time);
2110 } else {
2111 long delta = src.readLong();
2112 if (DEBUG) Slog.i(TAG, "READ DELTA: time delta=" + delta + " new time=" + cur.time);
2113 cur.time += delta;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002114 cur.numReadInts += 2;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002115 }
2116
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08002117 final int batteryLevelInt;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002118 if ((firstToken&DELTA_BATTERY_LEVEL_FLAG) != 0) {
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08002119 batteryLevelInt = src.readInt();
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002120 cur.batteryLevel = (byte)((batteryLevelInt>>25)&0x7f);
2121 cur.batteryTemperature = (short)((batteryLevelInt<<7)>>21);
2122 cur.batteryVoltage = (char)(batteryLevelInt&0x3fff);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002123 cur.numReadInts += 1;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002124 if (DEBUG) Slog.i(TAG, "READ DELTA: batteryToken=0x"
2125 + Integer.toHexString(batteryLevelInt)
2126 + " batteryLevel=" + cur.batteryLevel
2127 + " batteryTemp=" + cur.batteryTemperature
2128 + " batteryVolt=" + (int)cur.batteryVoltage);
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08002129 } else {
2130 batteryLevelInt = 0;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002131 }
2132
2133 if ((firstToken&DELTA_STATE_FLAG) != 0) {
2134 int stateInt = src.readInt();
2135 cur.states = (firstToken&DELTA_STATE_MASK) | (stateInt&(~DELTA_STATE_MASK));
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08002136 cur.batteryStatus = (byte)((stateInt>>STATE_BATTERY_STATUS_SHIFT)
2137 & STATE_BATTERY_STATUS_MASK);
2138 cur.batteryHealth = (byte)((stateInt>>STATE_BATTERY_HEALTH_SHIFT)
2139 & STATE_BATTERY_HEALTH_MASK);
2140 cur.batteryPlugType = (byte)((stateInt>>STATE_BATTERY_PLUG_SHIFT)
2141 & STATE_BATTERY_PLUG_MASK);
2142 switch (cur.batteryPlugType) {
2143 case 1:
2144 cur.batteryPlugType = BatteryManager.BATTERY_PLUGGED_AC;
2145 break;
2146 case 2:
2147 cur.batteryPlugType = BatteryManager.BATTERY_PLUGGED_USB;
2148 break;
2149 case 3:
2150 cur.batteryPlugType = BatteryManager.BATTERY_PLUGGED_WIRELESS;
2151 break;
2152 }
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002153 cur.numReadInts += 1;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002154 if (DEBUG) Slog.i(TAG, "READ DELTA: stateToken=0x"
2155 + Integer.toHexString(stateInt)
2156 + " batteryStatus=" + cur.batteryStatus
2157 + " batteryHealth=" + cur.batteryHealth
2158 + " batteryPlugType=" + cur.batteryPlugType
2159 + " states=0x" + Integer.toHexString(cur.states));
2160 } else {
2161 cur.states = (firstToken&DELTA_STATE_MASK) | (cur.states&(~DELTA_STATE_MASK));
2162 }
2163
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002164 if ((firstToken&DELTA_STATE2_FLAG) != 0) {
2165 cur.states2 = src.readInt();
2166 if (DEBUG) Slog.i(TAG, "READ DELTA: states2=0x"
2167 + Integer.toHexString(cur.states2));
2168 }
2169
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002170 if ((firstToken&DELTA_WAKELOCK_FLAG) != 0) {
Dianne Hackbornc51cf032014-03-02 19:08:15 -08002171 int indexes = src.readInt();
2172 int wakeLockIndex = indexes&0xffff;
2173 int wakeReasonIndex = (indexes>>16)&0xffff;
2174 if (wakeLockIndex != 0xffff) {
2175 cur.wakelockTag = cur.localWakelockTag;
2176 readHistoryTag(wakeLockIndex, cur.wakelockTag);
2177 if (DEBUG) Slog.i(TAG, "READ DELTA: wakelockTag=#" + cur.wakelockTag.poolIdx
2178 + " " + cur.wakelockTag.uid + ":" + cur.wakelockTag.string);
2179 } else {
2180 cur.wakelockTag = null;
2181 }
2182 if (wakeReasonIndex != 0xffff) {
2183 cur.wakeReasonTag = cur.localWakeReasonTag;
2184 readHistoryTag(wakeReasonIndex, cur.wakeReasonTag);
2185 if (DEBUG) Slog.i(TAG, "READ DELTA: wakeReasonTag=#" + cur.wakeReasonTag.poolIdx
2186 + " " + cur.wakeReasonTag.uid + ":" + cur.wakeReasonTag.string);
2187 } else {
2188 cur.wakeReasonTag = null;
2189 }
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002190 cur.numReadInts += 1;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002191 } else {
2192 cur.wakelockTag = null;
Dianne Hackbornc51cf032014-03-02 19:08:15 -08002193 cur.wakeReasonTag = null;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002194 }
2195
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002196 if ((firstToken&DELTA_EVENT_FLAG) != 0) {
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002197 cur.eventTag = cur.localEventTag;
2198 final int codeAndIndex = src.readInt();
Dianne Hackborn099bc622014-01-22 13:39:16 -08002199 cur.eventCode = (codeAndIndex&0xffff);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002200 final int index = ((codeAndIndex>>16)&0xffff);
2201 readHistoryTag(index, cur.eventTag);
2202 cur.numReadInts += 1;
2203 if (DEBUG) Slog.i(TAG, "READ DELTA: event=" + cur.eventCode + " tag=#"
2204 + cur.eventTag.poolIdx + " " + cur.eventTag.uid + ":"
2205 + cur.eventTag.string);
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002206 } else {
2207 cur.eventCode = HistoryItem.EVENT_NONE;
2208 }
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08002209
2210 if ((batteryLevelInt&BATTERY_DELTA_LEVEL_FLAG) != 0) {
2211 cur.stepDetails = mReadHistoryStepDetails;
2212 cur.stepDetails.readFromParcel(src);
2213 } else {
2214 cur.stepDetails = null;
2215 }
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002216 }
2217
Dianne Hackbornfc064132014-06-02 12:42:12 -07002218 @Override
2219 public void commitCurrentHistoryBatchLocked() {
2220 mHistoryLastWritten.cmd = HistoryItem.CMD_NULL;
2221 }
2222
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002223 void addHistoryBufferLocked(long elapsedRealtimeMs, long uptimeMs, HistoryItem cur) {
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002224 if (!mHaveBatteryLevel || !mRecordingHistory) {
2225 return;
2226 }
2227
Dianne Hackborn40c87252014-03-19 16:55:40 -07002228 final long timeDiff = (mHistoryBaseTime+elapsedRealtimeMs) - mHistoryLastWritten.time;
Dianne Hackborn0c820db2015-04-14 17:47:34 -07002229 final int diffStates = mHistoryLastWritten.states^(cur.states&mActiveHistoryStates);
2230 final int diffStates2 = mHistoryLastWritten.states2^(cur.states2&mActiveHistoryStates2);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002231 final int lastDiffStates = mHistoryLastWritten.states^mHistoryLastLastWritten.states;
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002232 final int lastDiffStates2 = mHistoryLastWritten.states2^mHistoryLastLastWritten.states2;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002233 if (DEBUG) Slog.i(TAG, "ADD: tdelta=" + timeDiff + " diff="
2234 + Integer.toHexString(diffStates) + " lastDiff="
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002235 + Integer.toHexString(lastDiffStates) + " diff2="
2236 + Integer.toHexString(diffStates2) + " lastDiff2="
2237 + Integer.toHexString(lastDiffStates2));
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002238 if (mHistoryBufferLastPos >= 0 && mHistoryLastWritten.cmd == HistoryItem.CMD_UPDATE
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002239 && timeDiff < 1000 && (diffStates&lastDiffStates) == 0
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002240 && (diffStates2&lastDiffStates2) == 0
2241 && (mHistoryLastWritten.wakelockTag == null || cur.wakelockTag == null)
2242 && (mHistoryLastWritten.wakeReasonTag == null || cur.wakeReasonTag == null)
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08002243 && mHistoryLastWritten.stepDetails == null
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002244 && (mHistoryLastWritten.eventCode == HistoryItem.EVENT_NONE
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002245 || cur.eventCode == HistoryItem.EVENT_NONE)
2246 && mHistoryLastWritten.batteryLevel == cur.batteryLevel
2247 && mHistoryLastWritten.batteryStatus == cur.batteryStatus
2248 && mHistoryLastWritten.batteryHealth == cur.batteryHealth
2249 && mHistoryLastWritten.batteryPlugType == cur.batteryPlugType
2250 && mHistoryLastWritten.batteryTemperature == cur.batteryTemperature
2251 && mHistoryLastWritten.batteryVoltage == cur.batteryVoltage) {
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002252 // We can merge this new change in with the last one. Merging is
Dianne Hackborn40c87252014-03-19 16:55:40 -07002253 // allowed as long as only the states have changed, and within those states
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002254 // as long as no bit has changed both between now and the last entry, as
2255 // well as the last entry and the one before it (so we capture any toggles).
2256 if (DEBUG) Slog.i(TAG, "ADD: rewinding back to " + mHistoryBufferLastPos);
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002257 mHistoryBuffer.setDataSize(mHistoryBufferLastPos);
2258 mHistoryBuffer.setDataPosition(mHistoryBufferLastPos);
2259 mHistoryBufferLastPos = -1;
Dianne Hackborn40c87252014-03-19 16:55:40 -07002260 elapsedRealtimeMs = mHistoryLastWritten.time - mHistoryBaseTime;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002261 // If the last written history had a wakelock tag, we need to retain it.
2262 // Note that the condition above made sure that we aren't in a case where
2263 // both it and the current history item have a wakelock tag.
2264 if (mHistoryLastWritten.wakelockTag != null) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002265 cur.wakelockTag = cur.localWakelockTag;
2266 cur.wakelockTag.setTo(mHistoryLastWritten.wakelockTag);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002267 }
Dianne Hackbornc51cf032014-03-02 19:08:15 -08002268 // If the last written history had a wake reason tag, we need to retain it.
2269 // Note that the condition above made sure that we aren't in a case where
2270 // both it and the current history item have a wakelock tag.
2271 if (mHistoryLastWritten.wakeReasonTag != null) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002272 cur.wakeReasonTag = cur.localWakeReasonTag;
2273 cur.wakeReasonTag.setTo(mHistoryLastWritten.wakeReasonTag);
Dianne Hackbornc51cf032014-03-02 19:08:15 -08002274 }
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002275 // If the last written history had an event, we need to retain it.
2276 // Note that the condition above made sure that we aren't in a case where
2277 // both it and the current history item have an event.
2278 if (mHistoryLastWritten.eventCode != HistoryItem.EVENT_NONE) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002279 cur.eventCode = mHistoryLastWritten.eventCode;
2280 cur.eventTag = cur.localEventTag;
2281 cur.eventTag.setTo(mHistoryLastWritten.eventTag);
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002282 }
Dianne Hackborn1fadab52011-04-14 17:57:33 -07002283 mHistoryLastWritten.setTo(mHistoryLastLastWritten);
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002284 }
2285
2286 final int dataSize = mHistoryBuffer.dataSize();
2287 if (dataSize >= MAX_HISTORY_BUFFER) {
2288 if (!mHistoryOverflow) {
2289 mHistoryOverflow = true;
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002290 addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_UPDATE, cur);
2291 addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_OVERFLOW, cur);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002292 return;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002293 }
2294
Dianne Hackborn0c820db2015-04-14 17:47:34 -07002295 // After overflow, we allow various bit-wise states to settle to 0.
2296 boolean writeAnyway = false;
2297 final int curStates = cur.states & HistoryItem.SETTLE_TO_ZERO_STATES
2298 & mActiveHistoryStates;
2299 if (mHistoryLastWritten.states != curStates) {
2300 // mActiveHistoryStates keeps track of which bits in .states are now being
2301 // forced to 0.
2302 int old = mActiveHistoryStates;
2303 mActiveHistoryStates &= curStates | ~HistoryItem.SETTLE_TO_ZERO_STATES;
2304 writeAnyway |= old != mActiveHistoryStates;
2305 }
2306 final int curStates2 = cur.states2 & HistoryItem.SETTLE_TO_ZERO_STATES2
2307 & mActiveHistoryStates2;
2308 if (mHistoryLastWritten.states2 != curStates2) {
2309 // mActiveHistoryStates2 keeps track of which bits in .states2 are now being
2310 // forced to 0.
2311 int old = mActiveHistoryStates2;
2312 mActiveHistoryStates2 &= curStates2 | ~HistoryItem.SETTLE_TO_ZERO_STATES2;
2313 writeAnyway |= old != mActiveHistoryStates2;
2314 }
2315
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002316 // Once we've reached the maximum number of items, we only
2317 // record changes to the battery level and the most interesting states.
2318 // Once we've reached the maximum maximum number of items, we only
2319 // record changes to the battery level.
Dianne Hackborn0c820db2015-04-14 17:47:34 -07002320 if (!writeAnyway && mHistoryLastWritten.batteryLevel == cur.batteryLevel &&
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002321 (dataSize >= MAX_MAX_HISTORY_BUFFER
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002322 || ((mHistoryLastWritten.states^cur.states)
Dianne Hackborn3251b902014-06-20 14:40:53 -07002323 & HistoryItem.MOST_INTERESTING_STATES) == 0
2324 || ((mHistoryLastWritten.states2^cur.states2)
2325 & HistoryItem.MOST_INTERESTING_STATES2) == 0)) {
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002326 return;
2327 }
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002328
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002329 addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_UPDATE, cur);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002330 return;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002331 }
2332
Dianne Hackbornfdb19562014-07-11 16:03:36 -07002333 if (dataSize == 0) {
2334 // The history is currently empty; we need it to start with a time stamp.
2335 cur.currentTime = System.currentTimeMillis();
2336 addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_RESET, cur);
2337 }
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002338 addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_UPDATE, cur);
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002339 }
2340
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002341 private void addHistoryBufferLocked(long elapsedRealtimeMs, long uptimeMs, byte cmd,
2342 HistoryItem cur) {
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002343 if (mIteratingHistory) {
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002344 throw new IllegalStateException("Can't do this while iterating history!");
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002345 }
2346 mHistoryBufferLastPos = mHistoryBuffer.dataPosition();
2347 mHistoryLastLastWritten.setTo(mHistoryLastWritten);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002348 mHistoryLastWritten.setTo(mHistoryBaseTime + elapsedRealtimeMs, cmd, cur);
Dianne Hackborn0c820db2015-04-14 17:47:34 -07002349 mHistoryLastWritten.states &= mActiveHistoryStates;
2350 mHistoryLastWritten.states2 &= mActiveHistoryStates2;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08002351 writeHistoryDelta(mHistoryBuffer, mHistoryLastWritten, mHistoryLastLastWritten);
Dianne Hackborn40c87252014-03-19 16:55:40 -07002352 mLastHistoryElapsedRealtime = elapsedRealtimeMs;
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002353 cur.wakelockTag = null;
2354 cur.wakeReasonTag = null;
2355 cur.eventCode = HistoryItem.EVENT_NONE;
2356 cur.eventTag = null;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002357 if (DEBUG_HISTORY) Slog.i(TAG, "Writing history buffer: was " + mHistoryBufferLastPos
2358 + " now " + mHistoryBuffer.dataPosition()
2359 + " size is now " + mHistoryBuffer.dataSize());
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002360 }
2361
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07002362 int mChangedStates = 0;
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002363 int mChangedStates2 = 0;
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07002364
Dianne Hackborn40c87252014-03-19 16:55:40 -07002365 void addHistoryRecordLocked(long elapsedRealtimeMs, long uptimeMs) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002366 if (mTrackRunningHistoryElapsedRealtime != 0) {
2367 final long diffElapsed = elapsedRealtimeMs - mTrackRunningHistoryElapsedRealtime;
2368 final long diffUptime = uptimeMs - mTrackRunningHistoryUptime;
2369 if (diffUptime < (diffElapsed-20)) {
2370 final long wakeElapsedTime = elapsedRealtimeMs - (diffElapsed - diffUptime);
2371 mHistoryAddTmp.setTo(mHistoryLastWritten);
2372 mHistoryAddTmp.wakelockTag = null;
2373 mHistoryAddTmp.wakeReasonTag = null;
2374 mHistoryAddTmp.eventCode = HistoryItem.EVENT_NONE;
2375 mHistoryAddTmp.states &= ~HistoryItem.STATE_CPU_RUNNING_FLAG;
2376 addHistoryRecordInnerLocked(wakeElapsedTime, uptimeMs, mHistoryAddTmp);
2377 }
2378 }
2379 mHistoryCur.states |= HistoryItem.STATE_CPU_RUNNING_FLAG;
2380 mTrackRunningHistoryElapsedRealtime = elapsedRealtimeMs;
2381 mTrackRunningHistoryUptime = uptimeMs;
2382 addHistoryRecordInnerLocked(elapsedRealtimeMs, uptimeMs, mHistoryCur);
2383 }
2384
2385 void addHistoryRecordInnerLocked(long elapsedRealtimeMs, long uptimeMs, HistoryItem cur) {
2386 addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, cur);
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002387
Dianne Hackborne8c88e62011-08-17 19:09:09 -07002388 if (!USE_OLD_HISTORY) {
2389 return;
2390 }
2391
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002392 if (!mHaveBatteryLevel || !mRecordingHistory) {
2393 return;
2394 }
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002395
2396 // If the current time is basically the same as the last time,
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07002397 // and no states have since the last recorded entry changed and
2398 // are now resetting back to their original value, then just collapse
2399 // into one record.
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002400 if (mHistoryEnd != null && mHistoryEnd.cmd == HistoryItem.CMD_UPDATE
Dianne Hackborn40c87252014-03-19 16:55:40 -07002401 && (mHistoryBaseTime+elapsedRealtimeMs) < (mHistoryEnd.time+1000)
Dianne Hackborn0c820db2015-04-14 17:47:34 -07002402 && ((mHistoryEnd.states^cur.states)&mChangedStates&mActiveHistoryStates) == 0
2403 && ((mHistoryEnd.states2^cur.states2)&mChangedStates2&mActiveHistoryStates2) == 0) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002404 // If the current is the same as the one before, then we no
2405 // longer need the entry.
2406 if (mHistoryLastEnd != null && mHistoryLastEnd.cmd == HistoryItem.CMD_UPDATE
Dianne Hackborn40c87252014-03-19 16:55:40 -07002407 && (mHistoryBaseTime+elapsedRealtimeMs) < (mHistoryEnd.time+500)
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002408 && mHistoryLastEnd.sameNonEvent(cur)) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002409 mHistoryLastEnd.next = null;
2410 mHistoryEnd.next = mHistoryCache;
2411 mHistoryCache = mHistoryEnd;
2412 mHistoryEnd = mHistoryLastEnd;
2413 mHistoryLastEnd = null;
2414 } else {
Dianne Hackborn0c820db2015-04-14 17:47:34 -07002415 mChangedStates |= mHistoryEnd.states^(cur.states&mActiveHistoryStates);
2416 mChangedStates2 |= mHistoryEnd.states^(cur.states2&mActiveHistoryStates2);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002417 mHistoryEnd.setTo(mHistoryEnd.time, HistoryItem.CMD_UPDATE, cur);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002418 }
2419 return;
2420 }
2421
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07002422 mChangedStates = 0;
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002423 mChangedStates2 = 0;
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07002424
2425 if (mNumHistoryItems == MAX_HISTORY_ITEMS
2426 || mNumHistoryItems == MAX_MAX_HISTORY_ITEMS) {
Dianne Hackborn40c87252014-03-19 16:55:40 -07002427 addHistoryRecordLocked(elapsedRealtimeMs, HistoryItem.CMD_OVERFLOW);
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07002428 }
2429
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002430 if (mNumHistoryItems >= MAX_HISTORY_ITEMS) {
2431 // Once we've reached the maximum number of items, we only
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07002432 // record changes to the battery level and the most interesting states.
2433 // Once we've reached the maximum maximum number of items, we only
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002434 // record changes to the battery level.
2435 if (mHistoryEnd != null && mHistoryEnd.batteryLevel
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002436 == cur.batteryLevel &&
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07002437 (mNumHistoryItems >= MAX_MAX_HISTORY_ITEMS
Dianne Hackborn0c820db2015-04-14 17:47:34 -07002438 || ((mHistoryEnd.states^(cur.states&mActiveHistoryStates))
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07002439 & HistoryItem.MOST_INTERESTING_STATES) == 0)) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002440 return;
2441 }
2442 }
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002443
Dianne Hackborn40c87252014-03-19 16:55:40 -07002444 addHistoryRecordLocked(elapsedRealtimeMs, HistoryItem.CMD_UPDATE);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002445 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07002446
Dianne Hackborn0c820db2015-04-14 17:47:34 -07002447 public void addHistoryEventLocked(long elapsedRealtimeMs, long uptimeMs, int code,
Dianne Hackborn40c87252014-03-19 16:55:40 -07002448 String name, int uid) {
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002449 mHistoryCur.eventCode = code;
2450 mHistoryCur.eventTag = mHistoryCur.localEventTag;
2451 mHistoryCur.eventTag.string = name;
2452 mHistoryCur.eventTag.uid = uid;
Dianne Hackborn4590e522014-03-24 13:36:46 -07002453 addHistoryRecordLocked(elapsedRealtimeMs, uptimeMs);
Dianne Hackborn099bc622014-01-22 13:39:16 -08002454 }
2455
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002456 void addHistoryRecordLocked(long elapsedRealtimeMs, long uptimeMs, byte cmd, HistoryItem cur) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002457 HistoryItem rec = mHistoryCache;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07002458 if (rec != null) {
2459 mHistoryCache = rec.next;
2460 } else {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002461 rec = new HistoryItem();
Dianne Hackborn32907cf2010-06-10 17:50:20 -07002462 }
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002463 rec.setTo(mHistoryBaseTime + elapsedRealtimeMs, cmd, cur);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07002464
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002465 addHistoryRecordLocked(rec);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07002466 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07002467
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002468 void addHistoryRecordLocked(HistoryItem rec) {
2469 mNumHistoryItems++;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07002470 rec.next = null;
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002471 mHistoryLastEnd = mHistoryEnd;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07002472 if (mHistoryEnd != null) {
2473 mHistoryEnd.next = rec;
2474 mHistoryEnd = rec;
2475 } else {
2476 mHistory = mHistoryEnd = rec;
2477 }
2478 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07002479
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002480 void clearHistoryLocked() {
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002481 if (DEBUG_HISTORY) Slog.i(TAG, "********** CLEARING HISTORY!");
Dianne Hackborne8c88e62011-08-17 19:09:09 -07002482 if (USE_OLD_HISTORY) {
2483 if (mHistory != null) {
2484 mHistoryEnd.next = mHistoryCache;
2485 mHistoryCache = mHistory;
2486 mHistory = mHistoryLastEnd = mHistoryEnd = null;
2487 }
2488 mNumHistoryItems = 0;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07002489 }
Dianne Hackborne8c88e62011-08-17 19:09:09 -07002490
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07002491 mHistoryBaseTime = 0;
Dianne Hackborn40c87252014-03-19 16:55:40 -07002492 mLastHistoryElapsedRealtime = 0;
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002493 mTrackRunningHistoryElapsedRealtime = 0;
2494 mTrackRunningHistoryUptime = 0;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002495
2496 mHistoryBuffer.setDataSize(0);
2497 mHistoryBuffer.setDataPosition(0);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002498 mHistoryBuffer.setDataCapacity(MAX_HISTORY_BUFFER / 2);
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002499 mHistoryLastLastWritten.clear();
2500 mHistoryLastWritten.clear();
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002501 mHistoryTagPool.clear();
2502 mNextHistoryTagIdx = 0;
2503 mNumHistoryTagChars = 0;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07002504 mHistoryBufferLastPos = -1;
2505 mHistoryOverflow = false;
Dianne Hackborn0c820db2015-04-14 17:47:34 -07002506 mActiveHistoryStates = 0xffffffff;
2507 mActiveHistoryStates2 = 0xffffffff;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07002508 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07002509
Dianne Hackborn97ae5382014-03-05 16:43:25 -08002510 public void updateTimeBasesLocked(boolean unplugged, boolean screenOff, long uptime,
2511 long realtime) {
Adam Lesinskie283d332015-04-16 12:29:25 -07002512 mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime);
Jeff Sharkey1059c3c2011-10-04 16:54:49 -07002513
Dianne Hackborn97ae5382014-03-05 16:43:25 -08002514 boolean unpluggedScreenOff = unplugged && screenOff;
2515 if (unpluggedScreenOff != mOnBatteryScreenOffTimeBase.isRunning()) {
2516 updateKernelWakelocksLocked();
Adam Lesinski72478f02015-06-17 15:39:43 -07002517 if (DEBUG_ENERGY_CPU) {
2518 Slog.d(TAG, "Updating cpu time because screen is now " +
2519 (unpluggedScreenOff ? "off" : "on"));
Dianne Hackborn97ae5382014-03-05 16:43:25 -08002520 }
Adam Lesinski72478f02015-06-17 15:39:43 -07002521 updateCpuTimeLocked();
Dianne Hackborn97ae5382014-03-05 16:43:25 -08002522 mOnBatteryScreenOffTimeBase.setRunning(unpluggedScreenOff, uptime, realtime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002523 }
2524 }
Amith Yamasani3718aaa2009-06-09 06:32:35 -07002525
Dianne Hackborn099bc622014-01-22 13:39:16 -08002526 public void addIsolatedUidLocked(int isolatedUid, int appUid) {
2527 mIsolatedUids.put(isolatedUid, appUid);
2528 }
2529
Adam Lesinski61db88f2015-07-01 15:05:07 -07002530 /**
2531 * Schedules a read of the latest cpu times before removing the isolated UID.
2532 * @see #removeIsolatedUidLocked(int)
2533 */
2534 public void scheduleRemoveIsolatedUidLocked(int isolatedUid, int appUid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08002535 int curUid = mIsolatedUids.get(isolatedUid, -1);
2536 if (curUid == appUid) {
Adam Lesinski61db88f2015-07-01 15:05:07 -07002537 if (mExternalSync != null) {
2538 mExternalSync.scheduleCpuSyncDueToRemovedUid(isolatedUid);
2539 }
Dianne Hackborn099bc622014-01-22 13:39:16 -08002540 }
2541 }
2542
Adam Lesinski61db88f2015-07-01 15:05:07 -07002543 /**
2544 * This should only be called after the cpu times have been read.
2545 * @see #scheduleRemoveIsolatedUidLocked(int, int)
2546 */
2547 public void removeIsolatedUidLocked(int isolatedUid) {
2548 mIsolatedUids.delete(isolatedUid);
2549 mKernelUidCpuTimeReader.removeUid(isolatedUid);
2550 }
2551
Dianne Hackborn099bc622014-01-22 13:39:16 -08002552 public int mapUid(int uid) {
2553 int isolated = mIsolatedUids.get(uid, -1);
2554 return isolated > 0 ? isolated : uid;
2555 }
2556
2557 public void noteEventLocked(int code, String name, int uid) {
2558 uid = mapUid(uid);
Dianne Hackborn37de0982014-05-09 09:32:18 -07002559 if (!mActiveEvents.updateState(code, name, uid, 0)) {
2560 return;
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08002561 }
Dianne Hackborn40c87252014-03-19 16:55:40 -07002562 final long elapsedRealtime = SystemClock.elapsedRealtime();
2563 final long uptime = SystemClock.uptimeMillis();
2564 addHistoryEventLocked(elapsedRealtime, uptime, code, name, uid);
Dianne Hackborn099bc622014-01-22 13:39:16 -08002565 }
2566
Dianne Hackbornd48954f2015-07-22 17:20:33 -07002567 boolean ensureStartClockTime(final long currentTime) {
2568 final long ABOUT_ONE_YEAR = 365*24*60*60*1000L;
2569 if (currentTime > ABOUT_ONE_YEAR && mStartClockTime < (currentTime-ABOUT_ONE_YEAR)) {
2570 // If the start clock time has changed by more than a year, then presumably
2571 // the previous time was completely bogus. So we are going to figure out a
2572 // new time based on how much time has elapsed since we started counting.
2573 mStartClockTime = currentTime - (SystemClock.elapsedRealtime()-(mRealtimeStart/1000));
2574 return true;
2575 }
2576 return false;
2577 }
2578
Dianne Hackborn7d9eefd2014-08-27 18:30:31 -07002579 public void noteCurrentTimeChangedLocked() {
2580 final long currentTime = System.currentTimeMillis();
2581 final long elapsedRealtime = SystemClock.elapsedRealtime();
2582 final long uptime = SystemClock.uptimeMillis();
2583 recordCurrentTimeChangeLocked(currentTime, elapsedRealtime, uptime);
Dianne Hackbornd48954f2015-07-22 17:20:33 -07002584 ensureStartClockTime(currentTime);
Dianne Hackborn7d9eefd2014-08-27 18:30:31 -07002585 }
2586
Dianne Hackborn61659e52014-07-09 16:13:01 -07002587 public void noteProcessStartLocked(String name, int uid) {
2588 uid = mapUid(uid);
2589 if (isOnBattery()) {
2590 Uid u = getUidStatsLocked(uid);
2591 u.getProcessStatsLocked(name).incStartsLocked();
2592 }
2593 if (!mActiveEvents.updateState(HistoryItem.EVENT_PROC_START, name, uid, 0)) {
2594 return;
2595 }
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07002596 if (!mRecordAllHistory) {
2597 return;
2598 }
Dianne Hackborn61659e52014-07-09 16:13:01 -07002599 final long elapsedRealtime = SystemClock.elapsedRealtime();
2600 final long uptime = SystemClock.uptimeMillis();
2601 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PROC_START, name, uid);
2602 }
2603
Dianne Hackborn1e01d162014-12-04 17:46:42 -08002604 public void noteProcessCrashLocked(String name, int uid) {
2605 uid = mapUid(uid);
2606 if (isOnBattery()) {
2607 Uid u = getUidStatsLocked(uid);
2608 u.getProcessStatsLocked(name).incNumCrashesLocked();
2609 }
2610 }
2611
2612 public void noteProcessAnrLocked(String name, int uid) {
2613 uid = mapUid(uid);
2614 if (isOnBattery()) {
2615 Uid u = getUidStatsLocked(uid);
2616 u.getProcessStatsLocked(name).incNumAnrsLocked();
2617 }
2618 }
2619
Dianne Hackborn61659e52014-07-09 16:13:01 -07002620 public void noteProcessStateLocked(String name, int uid, int state) {
2621 uid = mapUid(uid);
2622 final long elapsedRealtime = SystemClock.elapsedRealtime();
2623 getUidStatsLocked(uid).updateProcessStateLocked(name, state, elapsedRealtime);
2624 }
2625
2626 public void noteProcessFinishLocked(String name, int uid) {
2627 uid = mapUid(uid);
2628 if (!mActiveEvents.updateState(HistoryItem.EVENT_PROC_FINISH, name, uid, 0)) {
2629 return;
2630 }
2631 final long elapsedRealtime = SystemClock.elapsedRealtime();
2632 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn61659e52014-07-09 16:13:01 -07002633 getUidStatsLocked(uid).updateProcessStateLocked(name, Uid.PROCESS_STATE_NONE,
2634 elapsedRealtime);
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07002635 if (!mRecordAllHistory) {
2636 return;
2637 }
2638 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PROC_FINISH, name, uid);
Dianne Hackborn61659e52014-07-09 16:13:01 -07002639 }
2640
Dianne Hackbornfdb19562014-07-11 16:03:36 -07002641 public void noteSyncStartLocked(String name, int uid) {
2642 uid = mapUid(uid);
2643 final long elapsedRealtime = SystemClock.elapsedRealtime();
2644 final long uptime = SystemClock.uptimeMillis();
2645 getUidStatsLocked(uid).noteStartSyncLocked(name, elapsedRealtime);
2646 if (!mActiveEvents.updateState(HistoryItem.EVENT_SYNC_START, name, uid, 0)) {
2647 return;
2648 }
2649 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_SYNC_START, name, uid);
2650 }
2651
2652 public void noteSyncFinishLocked(String name, int uid) {
2653 uid = mapUid(uid);
2654 final long elapsedRealtime = SystemClock.elapsedRealtime();
2655 final long uptime = SystemClock.uptimeMillis();
2656 getUidStatsLocked(uid).noteStopSyncLocked(name, elapsedRealtime);
2657 if (!mActiveEvents.updateState(HistoryItem.EVENT_SYNC_FINISH, name, uid, 0)) {
2658 return;
2659 }
2660 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_SYNC_FINISH, name, uid);
2661 }
2662
2663 public void noteJobStartLocked(String name, int uid) {
2664 uid = mapUid(uid);
2665 final long elapsedRealtime = SystemClock.elapsedRealtime();
2666 final long uptime = SystemClock.uptimeMillis();
2667 getUidStatsLocked(uid).noteStartJobLocked(name, elapsedRealtime);
2668 if (!mActiveEvents.updateState(HistoryItem.EVENT_JOB_START, name, uid, 0)) {
2669 return;
2670 }
2671 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_JOB_START, name, uid);
2672 }
2673
2674 public void noteJobFinishLocked(String name, int uid) {
2675 uid = mapUid(uid);
2676 final long elapsedRealtime = SystemClock.elapsedRealtime();
2677 final long uptime = SystemClock.uptimeMillis();
2678 getUidStatsLocked(uid).noteStopJobLocked(name, elapsedRealtime);
2679 if (!mActiveEvents.updateState(HistoryItem.EVENT_JOB_FINISH, name, uid, 0)) {
2680 return;
2681 }
2682 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_JOB_FINISH, name, uid);
2683 }
2684
Dianne Hackborn1e383822015-04-10 14:02:33 -07002685 public void noteAlarmStartLocked(String name, int uid) {
2686 if (!mRecordAllHistory) {
2687 return;
2688 }
2689 uid = mapUid(uid);
2690 final long elapsedRealtime = SystemClock.elapsedRealtime();
2691 final long uptime = SystemClock.uptimeMillis();
2692 if (!mActiveEvents.updateState(HistoryItem.EVENT_ALARM_START, name, uid, 0)) {
2693 return;
2694 }
2695 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ALARM_START, name, uid);
2696 }
2697
2698 public void noteAlarmFinishLocked(String name, int uid) {
2699 if (!mRecordAllHistory) {
2700 return;
2701 }
2702 uid = mapUid(uid);
2703 final long elapsedRealtime = SystemClock.elapsedRealtime();
2704 final long uptime = SystemClock.uptimeMillis();
2705 if (!mActiveEvents.updateState(HistoryItem.EVENT_ALARM_FINISH, name, uid, 0)) {
2706 return;
2707 }
2708 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ALARM_FINISH, name, uid);
2709 }
2710
Dianne Hackborn97ae5382014-03-05 16:43:25 -08002711 private void requestWakelockCpuUpdate() {
2712 if (!mHandler.hasMessages(MSG_UPDATE_WAKELOCKS)) {
2713 Message m = mHandler.obtainMessage(MSG_UPDATE_WAKELOCKS);
2714 mHandler.sendMessageDelayed(m, DELAY_UPDATE_WAKELOCKS);
2715 }
2716 }
2717
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08002718 private void requestImmediateCpuUpdate() {
2719 mHandler.removeMessages(MSG_UPDATE_WAKELOCKS);
2720 mHandler.sendEmptyMessage(MSG_UPDATE_WAKELOCKS);
2721 }
2722
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07002723 public void setRecordAllHistoryLocked(boolean enabled) {
2724 mRecordAllHistory = enabled;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07002725 if (!enabled) {
2726 // Clear out any existing state.
2727 mActiveEvents.removeEvents(HistoryItem.EVENT_WAKE_LOCK);
Dianne Hackborn1e383822015-04-10 14:02:33 -07002728 mActiveEvents.removeEvents(HistoryItem.EVENT_ALARM);
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07002729 // Record the currently running processes as stopping, now that we are no
2730 // longer tracking them.
2731 HashMap<String, SparseIntArray> active = mActiveEvents.getStateForEvent(
2732 HistoryItem.EVENT_PROC);
2733 if (active != null) {
2734 long mSecRealtime = SystemClock.elapsedRealtime();
2735 final long mSecUptime = SystemClock.uptimeMillis();
2736 for (HashMap.Entry<String, SparseIntArray> ent : active.entrySet()) {
2737 SparseIntArray uids = ent.getValue();
2738 for (int j=0; j<uids.size(); j++) {
2739 addHistoryEventLocked(mSecRealtime, mSecUptime,
2740 HistoryItem.EVENT_PROC_FINISH, ent.getKey(), uids.keyAt(j));
2741 }
2742 }
2743 }
2744 } else {
2745 // Record the currently running processes as starting, now that we are tracking them.
2746 HashMap<String, SparseIntArray> active = mActiveEvents.getStateForEvent(
2747 HistoryItem.EVENT_PROC);
2748 if (active != null) {
2749 long mSecRealtime = SystemClock.elapsedRealtime();
2750 final long mSecUptime = SystemClock.uptimeMillis();
2751 for (HashMap.Entry<String, SparseIntArray> ent : active.entrySet()) {
2752 SparseIntArray uids = ent.getValue();
2753 for (int j=0; j<uids.size(); j++) {
2754 addHistoryEventLocked(mSecRealtime, mSecUptime,
2755 HistoryItem.EVENT_PROC_START, ent.getKey(), uids.keyAt(j));
2756 }
2757 }
2758 }
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07002759 }
2760 }
2761
Dianne Hackborn9a755432014-05-15 17:05:22 -07002762 public void setNoAutoReset(boolean enabled) {
2763 mNoAutoReset = enabled;
2764 }
2765
2766 private String mInitialAcquireWakeName;
2767 private int mInitialAcquireWakeUid = -1;
2768
Dianne Hackborna1f1a3c2014-02-24 18:12:28 -08002769 public void noteStartWakeLocked(int uid, int pid, String name, String historyName, int type,
Dianne Hackborn40c87252014-03-19 16:55:40 -07002770 boolean unimportantForLogging, long elapsedRealtime, long uptime) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08002771 uid = mapUid(uid);
Dianne Hackborn1ebccf52010-08-15 13:04:34 -07002772 if (type == WAKE_TYPE_PARTIAL) {
2773 // Only care about partial wake locks, since full wake locks
2774 // will be canceled when the user puts the screen to sleep.
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002775 aggregateLastWakeupUptimeLocked(uptime);
Dianne Hackbornfc064132014-06-02 12:42:12 -07002776 if (historyName == null) {
2777 historyName = name;
2778 }
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07002779 if (mRecordAllHistory) {
Dianne Hackbornfc064132014-06-02 12:42:12 -07002780 if (mActiveEvents.updateState(HistoryItem.EVENT_WAKE_LOCK_START, historyName,
2781 uid, 0)) {
Dianne Hackborn536456f2014-05-23 16:51:05 -07002782 addHistoryEventLocked(elapsedRealtime, uptime,
Dianne Hackbornfc064132014-06-02 12:42:12 -07002783 HistoryItem.EVENT_WAKE_LOCK_START, historyName, uid);
Dianne Hackborn536456f2014-05-23 16:51:05 -07002784 }
2785 }
Dianne Hackborn1ebccf52010-08-15 13:04:34 -07002786 if (mWakeLockNesting == 0) {
2787 mHistoryCur.states |= HistoryItem.STATE_WAKE_LOCK_FLAG;
2788 if (DEBUG_HISTORY) Slog.v(TAG, "Start wake lock to: "
2789 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08002790 mHistoryCur.wakelockTag = mHistoryCur.localWakelockTag;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07002791 mHistoryCur.wakelockTag.string = mInitialAcquireWakeName = historyName;
Dianne Hackborn37de0982014-05-09 09:32:18 -07002792 mHistoryCur.wakelockTag.uid = mInitialAcquireWakeUid = uid;
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002793 mWakeLockImportant = !unimportantForLogging;
Dianne Hackborn40c87252014-03-19 16:55:40 -07002794 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackbornfc064132014-06-02 12:42:12 -07002795 } else if (!mWakeLockImportant && !unimportantForLogging
2796 && mHistoryLastWritten.cmd == HistoryItem.CMD_UPDATE) {
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002797 if (mHistoryLastWritten.wakelockTag != null) {
2798 // We'll try to update the last tag.
2799 mHistoryLastWritten.wakelockTag = null;
2800 mHistoryCur.wakelockTag = mHistoryCur.localWakelockTag;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07002801 mHistoryCur.wakelockTag.string = mInitialAcquireWakeName = historyName;
Dianne Hackborn37de0982014-05-09 09:32:18 -07002802 mHistoryCur.wakelockTag.uid = mInitialAcquireWakeUid = uid;
Dianne Hackborn40c87252014-03-19 16:55:40 -07002803 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08002804 }
2805 mWakeLockImportant = true;
Dianne Hackborn1ebccf52010-08-15 13:04:34 -07002806 }
2807 mWakeLockNesting++;
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002808 }
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002809 if (uid >= 0) {
Adam Lesinski72478f02015-06-17 15:39:43 -07002810 if (mOnBatteryScreenOffTimeBase.isRunning()) {
2811 // We only update the cpu time when a wake lock is acquired if the screen is off.
2812 // If the screen is on, we don't distribute the power amongst partial wakelocks.
2813 if (DEBUG_ENERGY_CPU) {
2814 Slog.d(TAG, "Updating cpu time because of +wake_lock");
2815 }
2816 requestWakelockCpuUpdate();
2817 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08002818 getUidStatsLocked(uid).noteStartWakeLocked(pid, name, type, elapsedRealtime);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002819 }
2820 }
2821
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07002822 public void noteStopWakeLocked(int uid, int pid, String name, String historyName, int type,
2823 long elapsedRealtime, long uptime) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08002824 uid = mapUid(uid);
Dianne Hackborn1ebccf52010-08-15 13:04:34 -07002825 if (type == WAKE_TYPE_PARTIAL) {
2826 mWakeLockNesting--;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07002827 if (mRecordAllHistory) {
Dianne Hackbornfc064132014-06-02 12:42:12 -07002828 if (historyName == null) {
2829 historyName = name;
2830 }
2831 if (mActiveEvents.updateState(HistoryItem.EVENT_WAKE_LOCK_FINISH, historyName,
2832 uid, 0)) {
Dianne Hackborn536456f2014-05-23 16:51:05 -07002833 addHistoryEventLocked(elapsedRealtime, uptime,
Dianne Hackbornfc064132014-06-02 12:42:12 -07002834 HistoryItem.EVENT_WAKE_LOCK_FINISH, historyName, uid);
Dianne Hackborn536456f2014-05-23 16:51:05 -07002835 }
2836 }
Dianne Hackborn1ebccf52010-08-15 13:04:34 -07002837 if (mWakeLockNesting == 0) {
2838 mHistoryCur.states &= ~HistoryItem.STATE_WAKE_LOCK_FLAG;
2839 if (DEBUG_HISTORY) Slog.v(TAG, "Stop wake lock to: "
2840 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn37de0982014-05-09 09:32:18 -07002841 mInitialAcquireWakeName = null;
2842 mInitialAcquireWakeUid = -1;
Dianne Hackborn40c87252014-03-19 16:55:40 -07002843 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn1ebccf52010-08-15 13:04:34 -07002844 }
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002845 }
2846 if (uid >= 0) {
Adam Lesinski72478f02015-06-17 15:39:43 -07002847 if (mOnBatteryScreenOffTimeBase.isRunning()) {
2848 if (DEBUG_ENERGY_CPU) {
2849 Slog.d(TAG, "Updating cpu time because of -wake_lock");
2850 }
2851 requestWakelockCpuUpdate();
2852 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08002853 getUidStatsLocked(uid).noteStopWakeLocked(pid, name, type, elapsedRealtime);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002854 }
2855 }
2856
Dianne Hackborna1f1a3c2014-02-24 18:12:28 -08002857 public void noteStartWakeFromSourceLocked(WorkSource ws, int pid, String name,
2858 String historyName, int type, boolean unimportantForLogging) {
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002859 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07002860 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002861 final int N = ws.size();
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07002862 for (int i=0; i<N; i++) {
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002863 noteStartWakeLocked(ws.get(i), pid, name, historyName, type, unimportantForLogging,
Dianne Hackborn40c87252014-03-19 16:55:40 -07002864 elapsedRealtime, uptime);
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002865 }
2866 }
2867
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07002868 public void noteChangeWakelockFromSourceLocked(WorkSource ws, int pid, String name,
2869 String historyName, int type, WorkSource newWs, int newPid, String newName,
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002870 String newHistoryName, int newType, boolean newUnimportantForLogging) {
2871 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07002872 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002873 // For correct semantics, we start the need worksources first, so that we won't
2874 // make inappropriate history items as if all wake locks went away and new ones
2875 // appeared. This is okay because tracking of wake locks allows nesting.
Dianne Hackborn40c87252014-03-19 16:55:40 -07002876 final int NN = newWs.size();
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002877 for (int i=0; i<NN; i++) {
2878 noteStartWakeLocked(newWs.get(i), newPid, newName, newHistoryName, newType,
Dianne Hackborn40c87252014-03-19 16:55:40 -07002879 newUnimportantForLogging, elapsedRealtime, uptime);
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002880 }
2881 final int NO = ws.size();
2882 for (int i=0; i<NO; i++) {
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07002883 noteStopWakeLocked(ws.get(i), pid, name, historyName, type, elapsedRealtime, uptime);
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07002884 }
2885 }
2886
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07002887 public void noteStopWakeFromSourceLocked(WorkSource ws, int pid, String name,
2888 String historyName, int type) {
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002889 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07002890 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002891 final int N = ws.size();
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07002892 for (int i=0; i<N; i++) {
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07002893 noteStopWakeLocked(ws.get(i), pid, name, historyName, type, elapsedRealtime, uptime);
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07002894 }
2895 }
2896
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002897 void aggregateLastWakeupUptimeLocked(long uptimeMs) {
2898 if (mLastWakeupReason != null) {
2899 long deltaUptime = uptimeMs - mLastWakeupUptimeMs;
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07002900 SamplingTimer timer = getWakeupReasonTimerLocked(mLastWakeupReason);
2901 timer.addCurrentReportedCount(1);
2902 timer.addCurrentReportedTotalTime(deltaUptime * 1000); // time is in microseconds
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002903 mLastWakeupReason = null;
2904 }
2905 }
2906
2907 public void noteWakeupReasonLocked(String reason) {
Dianne Hackbornc51cf032014-03-02 19:08:15 -08002908 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07002909 final long uptime = SystemClock.uptimeMillis();
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07002910 if (DEBUG_HISTORY) Slog.v(TAG, "Wakeup reason \"" + reason +"\": "
Dianne Hackbornc51cf032014-03-02 19:08:15 -08002911 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002912 aggregateLastWakeupUptimeLocked(uptime);
Dianne Hackbornc51cf032014-03-02 19:08:15 -08002913 mHistoryCur.wakeReasonTag = mHistoryCur.localWakeReasonTag;
2914 mHistoryCur.wakeReasonTag.string = reason;
Dianne Hackborna1bd7922014-03-21 11:07:11 -07002915 mHistoryCur.wakeReasonTag.uid = 0;
2916 mLastWakeupReason = reason;
2917 mLastWakeupUptimeMs = uptime;
Dianne Hackborn40c87252014-03-19 16:55:40 -07002918 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackbornc51cf032014-03-02 19:08:15 -08002919 }
2920
Adam Lesinski72478f02015-06-17 15:39:43 -07002921 public boolean startAddingCpuLocked() {
Dianne Hackborn0d903a82010-09-07 23:51:03 -07002922 mHandler.removeMessages(MSG_UPDATE_WAKELOCKS);
Adam Lesinski72478f02015-06-17 15:39:43 -07002923 return mOnBatteryInternal;
Dianne Hackborn0d903a82010-09-07 23:51:03 -07002924 }
2925
Adam Lesinski72478f02015-06-17 15:39:43 -07002926 public void finishAddingCpuLocked(int totalUTime, int totalSTime, int statUserTime,
2927 int statSystemTime, int statIOWaitTime, int statIrqTime,
2928 int statSoftIrqTime, int statIdleTime) {
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08002929 if (DEBUG) Slog.d(TAG, "Adding cpu: tuser=" + totalUTime + " tsys=" + totalSTime
2930 + " user=" + statUserTime + " sys=" + statSystemTime
2931 + " io=" + statIOWaitTime + " irq=" + statIrqTime
2932 + " sirq=" + statSoftIrqTime + " idle=" + statIdleTime);
2933 mCurStepCpuUserTime += totalUTime;
2934 mCurStepCpuSystemTime += totalSTime;
2935 mCurStepStatUserTime += statUserTime;
2936 mCurStepStatSystemTime += statSystemTime;
2937 mCurStepStatIOWaitTime += statIOWaitTime;
2938 mCurStepStatIrqTime += statIrqTime;
2939 mCurStepStatSoftIrqTime += statSoftIrqTime;
2940 mCurStepStatIdleTime += statIdleTime;
Dianne Hackborn0d903a82010-09-07 23:51:03 -07002941 }
2942
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002943 public void noteProcessDiedLocked(int uid, int pid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08002944 uid = mapUid(uid);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002945 Uid u = mUidStats.get(uid);
2946 if (u != null) {
2947 u.mPids.remove(pid);
2948 }
2949 }
2950
2951 public long getProcessWakeTime(int uid, int pid, long realtime) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08002952 uid = mapUid(uid);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002953 Uid u = mUidStats.get(uid);
2954 if (u != null) {
2955 Uid.Pid p = u.mPids.get(pid);
2956 if (p != null) {
Dianne Hackborne5167ca2014-03-08 14:39:10 -08002957 return p.mWakeSumMs + (p.mWakeNesting > 0 ? (realtime - p.mWakeStartMs) : 0);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002958 }
2959 }
2960 return 0;
2961 }
2962
2963 public void reportExcessiveWakeLocked(int uid, String proc, long overTime, long usedTime) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08002964 uid = mapUid(uid);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002965 Uid u = mUidStats.get(uid);
2966 if (u != null) {
2967 u.reportExcessiveWakeLocked(proc, overTime, usedTime);
2968 }
2969 }
2970
Dianne Hackborn287952c2010-09-22 22:34:31 -07002971 public void reportExcessiveCpuLocked(int uid, String proc, long overTime, long usedTime) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08002972 uid = mapUid(uid);
Dianne Hackborn287952c2010-09-22 22:34:31 -07002973 Uid u = mUidStats.get(uid);
2974 if (u != null) {
2975 u.reportExcessiveCpuLocked(proc, overTime, usedTime);
2976 }
2977 }
2978
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002979 int mSensorNesting;
2980
2981 public void noteStartSensorLocked(int uid, int sensor) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08002982 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08002983 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07002984 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002985 if (mSensorNesting == 0) {
2986 mHistoryCur.states |= HistoryItem.STATE_SENSOR_ON_FLAG;
2987 if (DEBUG_HISTORY) Slog.v(TAG, "Start sensor to: "
2988 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07002989 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002990 }
2991 mSensorNesting++;
Dianne Hackbornca1bf212014-02-14 14:18:36 -08002992 getUidStatsLocked(uid).noteStartSensor(sensor, elapsedRealtime);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002993 }
2994
2995 public void noteStopSensorLocked(int uid, int sensor) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08002996 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08002997 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07002998 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07002999 mSensorNesting--;
3000 if (mSensorNesting == 0) {
3001 mHistoryCur.states &= ~HistoryItem.STATE_SENSOR_ON_FLAG;
3002 if (DEBUG_HISTORY) Slog.v(TAG, "Stop sensor to: "
3003 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003004 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07003005 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003006 getUidStatsLocked(uid).noteStopSensor(sensor, elapsedRealtime);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07003007 }
3008
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003009 int mGpsNesting;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003010
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003011 public void noteStartGpsLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003012 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003013 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003014 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003015 if (mGpsNesting == 0) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003016 mHistoryCur.states |= HistoryItem.STATE_GPS_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003017 if (DEBUG_HISTORY) Slog.v(TAG, "Start GPS to: "
3018 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003019 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003020 }
3021 mGpsNesting++;
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003022 getUidStatsLocked(uid).noteStartGps(elapsedRealtime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003023 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003024
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003025 public void noteStopGpsLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003026 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003027 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003028 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003029 mGpsNesting--;
3030 if (mGpsNesting == 0) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003031 mHistoryCur.states &= ~HistoryItem.STATE_GPS_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003032 if (DEBUG_HISTORY) Slog.v(TAG, "Stop GPS to: "
3033 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003034 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003035 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003036 getUidStatsLocked(uid).noteStopGps(elapsedRealtime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003037 }
Amith Yamasani3718aaa2009-06-09 06:32:35 -07003038
Jeff Browne95c3cd2014-05-02 16:59:26 -07003039 public void noteScreenStateLocked(int state) {
3040 if (mScreenState != state) {
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08003041 recordDailyStatsIfNeededLocked(true);
Jeff Browne95c3cd2014-05-02 16:59:26 -07003042 final int oldState = mScreenState;
3043 mScreenState = state;
3044 if (DEBUG) Slog.v(TAG, "Screen state: oldState=" + Display.stateToString(oldState)
3045 + ", newState=" + Display.stateToString(state));
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07003046
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07003047 if (state != Display.STATE_UNKNOWN) {
3048 int stepState = state-1;
3049 if (stepState < 4) {
3050 mModStepMode |= (mCurStepMode&STEP_LEVEL_MODE_SCREEN_STATE) ^ stepState;
3051 mCurStepMode = (mCurStepMode&~STEP_LEVEL_MODE_SCREEN_STATE) | stepState;
3052 } else {
3053 Slog.wtf(TAG, "Unexpected screen state: " + state);
3054 }
3055 }
3056
Jeff Browne95c3cd2014-05-02 16:59:26 -07003057 if (state == Display.STATE_ON) {
3058 // Screen turning on.
3059 final long elapsedRealtime = SystemClock.elapsedRealtime();
3060 final long uptime = SystemClock.uptimeMillis();
3061 mHistoryCur.states |= HistoryItem.STATE_SCREEN_ON_FLAG;
3062 if (DEBUG_HISTORY) Slog.v(TAG, "Screen on to: "
3063 + Integer.toHexString(mHistoryCur.states));
3064 addHistoryRecordLocked(elapsedRealtime, uptime);
3065 mScreenOnTimer.startRunningLocked(elapsedRealtime);
3066 if (mScreenBrightnessBin >= 0) {
3067 mScreenBrightnessTimer[mScreenBrightnessBin].startRunningLocked(elapsedRealtime);
3068 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003069
Jeff Browne95c3cd2014-05-02 16:59:26 -07003070 updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), false,
3071 SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000);
Dianne Hackborne5167ca2014-03-08 14:39:10 -08003072
Jeff Browne95c3cd2014-05-02 16:59:26 -07003073 // Fake a wake lock, so we consider the device waked as long
3074 // as the screen is on.
3075 noteStartWakeLocked(-1, -1, "screen", null, WAKE_TYPE_PARTIAL, false,
3076 elapsedRealtime, uptime);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003077
Jeff Browne95c3cd2014-05-02 16:59:26 -07003078 // Update discharge amounts.
3079 if (mOnBatteryInternal) {
3080 updateDischargeScreenLevelsLocked(false, true);
3081 }
3082 } else if (oldState == Display.STATE_ON) {
3083 // Screen turning off or dozing.
3084 final long elapsedRealtime = SystemClock.elapsedRealtime();
3085 final long uptime = SystemClock.uptimeMillis();
3086 mHistoryCur.states &= ~HistoryItem.STATE_SCREEN_ON_FLAG;
3087 if (DEBUG_HISTORY) Slog.v(TAG, "Screen off to: "
3088 + Integer.toHexString(mHistoryCur.states));
3089 addHistoryRecordLocked(elapsedRealtime, uptime);
3090 mScreenOnTimer.stopRunningLocked(elapsedRealtime);
3091 if (mScreenBrightnessBin >= 0) {
3092 mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(elapsedRealtime);
3093 }
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07003094
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07003095 noteStopWakeLocked(-1, -1, "screen", "screen", WAKE_TYPE_PARTIAL,
Jeff Browne95c3cd2014-05-02 16:59:26 -07003096 elapsedRealtime, uptime);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003097
Jeff Browne95c3cd2014-05-02 16:59:26 -07003098 updateTimeBasesLocked(mOnBatteryTimeBase.isRunning(), true,
3099 SystemClock.uptimeMillis() * 1000, elapsedRealtime * 1000);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003100
Jeff Browne95c3cd2014-05-02 16:59:26 -07003101 // Update discharge amounts.
3102 if (mOnBatteryInternal) {
3103 updateDischargeScreenLevelsLocked(true, false);
3104 }
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08003105 }
Dianne Hackborn617f8772009-03-31 15:04:46 -07003106 }
3107 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003108
Dianne Hackborn617f8772009-03-31 15:04:46 -07003109 public void noteScreenBrightnessLocked(int brightness) {
3110 // Bin the brightness.
3111 int bin = brightness / (256/NUM_SCREEN_BRIGHTNESS_BINS);
3112 if (bin < 0) bin = 0;
3113 else if (bin >= NUM_SCREEN_BRIGHTNESS_BINS) bin = NUM_SCREEN_BRIGHTNESS_BINS-1;
3114 if (mScreenBrightnessBin != bin) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003115 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003116 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003117 mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_BRIGHTNESS_MASK)
3118 | (bin << HistoryItem.STATE_BRIGHTNESS_SHIFT);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003119 if (DEBUG_HISTORY) Slog.v(TAG, "Screen brightness " + bin + " to: "
3120 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003121 addHistoryRecordLocked(elapsedRealtime, uptime);
Jeff Browne95c3cd2014-05-02 16:59:26 -07003122 if (mScreenState == Display.STATE_ON) {
Dianne Hackborn617f8772009-03-31 15:04:46 -07003123 if (mScreenBrightnessBin >= 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003124 mScreenBrightnessTimer[mScreenBrightnessBin].stopRunningLocked(elapsedRealtime);
Dianne Hackborn617f8772009-03-31 15:04:46 -07003125 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003126 mScreenBrightnessTimer[bin].startRunningLocked(elapsedRealtime);
Dianne Hackborn617f8772009-03-31 15:04:46 -07003127 }
3128 mScreenBrightnessBin = bin;
3129 }
3130 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003131
Dianne Hackborn617f8772009-03-31 15:04:46 -07003132 public void noteUserActivityLocked(int uid, int event) {
Dianne Hackborn77b987f2014-02-26 16:20:52 -08003133 if (mOnBatteryInternal) {
3134 uid = mapUid(uid);
3135 getUidStatsLocked(uid).noteUserActivityLocked(event);
3136 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003137 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003138
Dianne Hackborn280a64e2015-07-13 14:48:08 -07003139 public void noteWakeUpLocked(String reason, int reasonUid) {
3140 final long elapsedRealtime = SystemClock.elapsedRealtime();
3141 final long uptime = SystemClock.uptimeMillis();
3142 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_SCREEN_WAKE_UP,
3143 reason, reasonUid);
3144 }
3145
Jeff Browne95c3cd2014-05-02 16:59:26 -07003146 public void noteInteractiveLocked(boolean interactive) {
3147 if (mInteractive != interactive) {
3148 final long elapsedRealtime = SystemClock.elapsedRealtime();
3149 mInteractive = interactive;
3150 if (DEBUG) Slog.v(TAG, "Interactive: " + interactive);
3151 if (interactive) {
3152 mInteractiveTimer.startRunningLocked(elapsedRealtime);
3153 } else {
3154 mInteractiveTimer.stopRunningLocked(elapsedRealtime);
3155 }
3156 }
3157 }
3158
Dianne Hackborn1e01d162014-12-04 17:46:42 -08003159 public void noteConnectivityChangedLocked(int type, String extra) {
3160 final long elapsedRealtime = SystemClock.elapsedRealtime();
3161 final long uptime = SystemClock.uptimeMillis();
3162 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_CONNECTIVITY_CHANGED,
3163 extra, type);
3164 mNumConnectivityChange++;
3165 }
3166
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07003167 public void noteMobileRadioPowerState(int powerState, long timestampNs) {
3168 final long elapsedRealtime = SystemClock.elapsedRealtime();
3169 final long uptime = SystemClock.uptimeMillis();
3170 if (mMobileRadioPowerState != powerState) {
3171 long realElapsedRealtimeMs;
3172 final boolean active =
3173 powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM
3174 || powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH;
3175 if (active) {
Dianne Hackbornf7097a52014-05-13 09:56:14 -07003176 mMobileRadioActiveStartTime = realElapsedRealtimeMs = elapsedRealtime;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07003177 mHistoryCur.states |= HistoryItem.STATE_MOBILE_RADIO_ACTIVE_FLAG;
3178 } else {
3179 realElapsedRealtimeMs = timestampNs / (1000*1000);
Dianne Hackbornf7097a52014-05-13 09:56:14 -07003180 long lastUpdateTimeMs = mMobileRadioActiveStartTime;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07003181 if (realElapsedRealtimeMs < lastUpdateTimeMs) {
3182 Slog.wtf(TAG, "Data connection inactive timestamp " + realElapsedRealtimeMs
3183 + " is before start time " + lastUpdateTimeMs);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07003184 realElapsedRealtimeMs = elapsedRealtime;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07003185 } else if (realElapsedRealtimeMs < elapsedRealtime) {
3186 mMobileRadioActiveAdjustedTime.addCountLocked(elapsedRealtime
3187 - realElapsedRealtimeMs);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07003188 }
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07003189 mHistoryCur.states &= ~HistoryItem.STATE_MOBILE_RADIO_ACTIVE_FLAG;
3190 }
3191 if (DEBUG_HISTORY) Slog.v(TAG, "Mobile network active " + active + " to: "
3192 + Integer.toHexString(mHistoryCur.states));
3193 addHistoryRecordLocked(elapsedRealtime, uptime);
3194 mMobileRadioPowerState = powerState;
3195 if (active) {
3196 mMobileRadioActiveTimer.startRunningLocked(elapsedRealtime);
3197 mMobileRadioActivePerAppTimer.startRunningLocked(elapsedRealtime);
3198 } else {
3199 mMobileRadioActiveTimer.stopRunningLocked(realElapsedRealtimeMs);
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07003200 updateMobileRadioStateLocked(realElapsedRealtimeMs);
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07003201 mMobileRadioActivePerAppTimer.stopRunningLocked(realElapsedRealtimeMs);
Dianne Hackborne13c4c02014-02-11 17:18:35 -08003202 }
Dianne Hackborne13c4c02014-02-11 17:18:35 -08003203 }
3204 }
3205
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003206 public void notePowerSaveMode(boolean enabled) {
3207 if (mPowerSaveModeEnabled != enabled) {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07003208 int stepState = enabled ? STEP_LEVEL_MODE_POWER_SAVE : 0;
3209 mModStepMode |= (mCurStepMode&STEP_LEVEL_MODE_POWER_SAVE) ^ stepState;
3210 mCurStepMode = (mCurStepMode&~STEP_LEVEL_MODE_POWER_SAVE) | stepState;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07003211 final long elapsedRealtime = SystemClock.elapsedRealtime();
3212 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003213 mPowerSaveModeEnabled = enabled;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07003214 if (enabled) {
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003215 mHistoryCur.states2 |= HistoryItem.STATE2_POWER_SAVE_FLAG;
3216 if (DEBUG_HISTORY) Slog.v(TAG, "Power save mode enabled to: "
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07003217 + Integer.toHexString(mHistoryCur.states2));
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003218 mPowerSaveModeEnabledTimer.startRunningLocked(elapsedRealtime);
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07003219 } else {
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003220 mHistoryCur.states2 &= ~HistoryItem.STATE2_POWER_SAVE_FLAG;
3221 if (DEBUG_HISTORY) Slog.v(TAG, "Power save mode disabled to: "
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07003222 + Integer.toHexString(mHistoryCur.states2));
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003223 mPowerSaveModeEnabledTimer.stopRunningLocked(elapsedRealtime);
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07003224 }
3225 addHistoryRecordLocked(elapsedRealtime, uptime);
3226 }
3227 }
3228
Dianne Hackborn08c47a52015-10-15 12:38:14 -07003229 public void noteDeviceIdleModeLocked(int mode, String activeReason, int activeUid) {
Dianne Hackborn88e98df2015-03-23 13:29:14 -07003230 final long elapsedRealtime = SystemClock.elapsedRealtime();
3231 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn08c47a52015-10-15 12:38:14 -07003232 boolean nowIdling = mode == DEVICE_IDLE_MODE_FULL;
3233 if (mDeviceIdling && !nowIdling && activeReason == null) {
Dianne Hackborn88e98df2015-03-23 13:29:14 -07003234 // We don't go out of general idling mode until explicitly taken out of
3235 // device idle through going active or significant motion.
3236 nowIdling = true;
3237 }
Dianne Hackborn08c47a52015-10-15 12:38:14 -07003238 boolean nowLightIdling = mode == DEVICE_IDLE_MODE_LIGHT;
3239 if (mDeviceLightIdling && !nowLightIdling && !nowIdling && activeReason == null) {
3240 // We don't go out of general light idling mode until explicitly taken out of
3241 // device idle through going active or significant motion.
3242 nowLightIdling = true;
3243 }
3244 if (activeReason != null && (mDeviceIdling || mDeviceLightIdling)) {
3245 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_ACTIVE,
3246 activeReason, activeUid);
3247 }
Dianne Hackborn88e98df2015-03-23 13:29:14 -07003248 if (mDeviceIdling != nowIdling) {
3249 mDeviceIdling = nowIdling;
3250 int stepState = nowIdling ? STEP_LEVEL_MODE_DEVICE_IDLE : 0;
3251 mModStepMode |= (mCurStepMode&STEP_LEVEL_MODE_DEVICE_IDLE) ^ stepState;
3252 mCurStepMode = (mCurStepMode&~STEP_LEVEL_MODE_DEVICE_IDLE) | stepState;
Dianne Hackborn08c47a52015-10-15 12:38:14 -07003253 if (nowIdling) {
Dianne Hackborn88e98df2015-03-23 13:29:14 -07003254 mDeviceIdlingTimer.startRunningLocked(elapsedRealtime);
3255 } else {
3256 mDeviceIdlingTimer.stopRunningLocked(elapsedRealtime);
3257 }
3258 }
Dianne Hackborn08c47a52015-10-15 12:38:14 -07003259 if (mDeviceLightIdling != nowLightIdling) {
3260 mDeviceLightIdling = nowLightIdling;
3261 if (nowLightIdling) {
3262 mDeviceLightIdlingTimer.startRunningLocked(elapsedRealtime);
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003263 } else {
Dianne Hackborn08c47a52015-10-15 12:38:14 -07003264 mDeviceLightIdlingTimer.stopRunningLocked(elapsedRealtime);
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003265 }
Dianne Hackborn08c47a52015-10-15 12:38:14 -07003266 }
3267 if (mDeviceIdleMode != mode) {
3268 mHistoryCur.states2 = (mHistoryCur.states2 & ~HistoryItem.STATE2_DEVICE_IDLE_MASK)
3269 | (mode << HistoryItem.STATE2_DEVICE_IDLE_SHIFT);
3270 if (DEBUG_HISTORY) Slog.v(TAG, "Device idle mode changed to: "
3271 + Integer.toHexString(mHistoryCur.states2));
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003272 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn08c47a52015-10-15 12:38:14 -07003273 long lastDuration = elapsedRealtime - mLastIdleTimeStart;
3274 mLastIdleTimeStart = elapsedRealtime;
3275 if (mDeviceIdleMode == DEVICE_IDLE_MODE_LIGHT) {
3276 if (lastDuration > mLongestLightIdleTime) {
3277 mLongestLightIdleTime = lastDuration;
3278 }
3279 mDeviceIdleModeLightTimer.stopRunningLocked(elapsedRealtime);
3280 } else if (mDeviceIdleMode == DEVICE_IDLE_MODE_FULL) {
3281 if (lastDuration > mLongestFullIdleTime) {
3282 mLongestFullIdleTime = lastDuration;
3283 }
3284 mDeviceIdleModeFullTimer.stopRunningLocked(elapsedRealtime);
3285 }
3286 if (mode == DEVICE_IDLE_MODE_LIGHT) {
3287 mDeviceIdleModeLightTimer.startRunningLocked(elapsedRealtime);
3288 } else if (mode == DEVICE_IDLE_MODE_FULL) {
3289 mDeviceIdleModeFullTimer.startRunningLocked(elapsedRealtime);
3290 }
3291 mDeviceIdleMode = mode;
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003292 }
3293 }
3294
3295 public void notePackageInstalledLocked(String pkgName, int versionCode) {
3296 final long elapsedRealtime = SystemClock.elapsedRealtime();
3297 final long uptime = SystemClock.uptimeMillis();
3298 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PACKAGE_INSTALLED,
3299 pkgName, versionCode);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07003300 PackageChange pc = new PackageChange();
3301 pc.mPackageName = pkgName;
3302 pc.mUpdate = true;
3303 pc.mVersionCode = versionCode;
3304 addPackageChange(pc);
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003305 }
3306
3307 public void notePackageUninstalledLocked(String pkgName) {
3308 final long elapsedRealtime = SystemClock.elapsedRealtime();
3309 final long uptime = SystemClock.uptimeMillis();
3310 addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_PACKAGE_UNINSTALLED,
3311 pkgName, 0);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07003312 PackageChange pc = new PackageChange();
3313 pc.mPackageName = pkgName;
3314 pc.mUpdate = true;
3315 addPackageChange(pc);
3316 }
3317
3318 private void addPackageChange(PackageChange pc) {
3319 if (mDailyPackageChanges == null) {
3320 mDailyPackageChanges = new ArrayList<>();
3321 }
3322 mDailyPackageChanges.add(pc);
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07003323 }
3324
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003325 public void notePhoneOnLocked() {
3326 if (!mPhoneOn) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003327 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003328 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn0c820db2015-04-14 17:47:34 -07003329 mHistoryCur.states2 |= HistoryItem.STATE2_PHONE_IN_CALL_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003330 if (DEBUG_HISTORY) Slog.v(TAG, "Phone on to: "
3331 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003332 addHistoryRecordLocked(elapsedRealtime, uptime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003333 mPhoneOn = true;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003334 mPhoneOnTimer.startRunningLocked(elapsedRealtime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003335 }
3336 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003337
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003338 public void notePhoneOffLocked() {
3339 if (mPhoneOn) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003340 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003341 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn0c820db2015-04-14 17:47:34 -07003342 mHistoryCur.states2 &= ~HistoryItem.STATE2_PHONE_IN_CALL_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003343 if (DEBUG_HISTORY) Slog.v(TAG, "Phone off to: "
3344 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003345 addHistoryRecordLocked(elapsedRealtime, uptime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003346 mPhoneOn = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003347 mPhoneOnTimer.stopRunningLocked(elapsedRealtime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003348 }
3349 }
Amith Yamasani32dbefd2009-06-19 09:21:17 -07003350
Dianne Hackborn3251b902014-06-20 14:40:53 -07003351 void stopAllPhoneSignalStrengthTimersLocked(int except) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003352 final long elapsedRealtime = SystemClock.elapsedRealtime();
Wink Saville52840902011-02-18 12:40:47 -08003353 for (int i = 0; i < SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07003354 if (i == except) {
3355 continue;
3356 }
3357 while (mPhoneSignalStrengthsTimer[i].isRunningLocked()) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003358 mPhoneSignalStrengthsTimer[i].stopRunningLocked(elapsedRealtime);
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07003359 }
3360 }
3361 }
3362
Dianne Hackborne4a59512010-12-07 11:08:07 -08003363 private int fixPhoneServiceState(int state, int signalBin) {
3364 if (mPhoneSimStateRaw == TelephonyManager.SIM_STATE_ABSENT) {
3365 // In this case we will always be STATE_OUT_OF_SERVICE, so need
3366 // to infer that we are scanning from other data.
3367 if (state == ServiceState.STATE_OUT_OF_SERVICE
Wink Saville52840902011-02-18 12:40:47 -08003368 && signalBin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
Dianne Hackborne4a59512010-12-07 11:08:07 -08003369 state = ServiceState.STATE_IN_SERVICE;
3370 }
3371 }
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07003372
Dianne Hackborne4a59512010-12-07 11:08:07 -08003373 return state;
3374 }
3375
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003376 private void updateAllPhoneStateLocked(int state, int simState, int strengthBin) {
Dianne Hackborne4a59512010-12-07 11:08:07 -08003377 boolean scanning = false;
3378 boolean newHistory = false;
3379
3380 mPhoneServiceStateRaw = state;
3381 mPhoneSimStateRaw = simState;
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003382 mPhoneSignalStrengthBinRaw = strengthBin;
3383
3384 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003385 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborne4a59512010-12-07 11:08:07 -08003386
3387 if (simState == TelephonyManager.SIM_STATE_ABSENT) {
3388 // In this case we will always be STATE_OUT_OF_SERVICE, so need
3389 // to infer that we are scanning from other data.
3390 if (state == ServiceState.STATE_OUT_OF_SERVICE
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003391 && strengthBin > SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN) {
Dianne Hackborne4a59512010-12-07 11:08:07 -08003392 state = ServiceState.STATE_IN_SERVICE;
3393 }
3394 }
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07003395
3396 // If the phone is powered off, stop all timers.
3397 if (state == ServiceState.STATE_POWER_OFF) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003398 strengthBin = -1;
Amith Yamasanif37447b2009-10-08 18:28:01 -07003399
Dianne Hackborne4a59512010-12-07 11:08:07 -08003400 // If we are in service, make sure the correct signal string timer is running.
3401 } else if (state == ServiceState.STATE_IN_SERVICE) {
3402 // Bin will be changed below.
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07003403
3404 // If we're out of service, we are in the lowest signal strength
3405 // bin and have the scanning bit set.
Amith Yamasanif37447b2009-10-08 18:28:01 -07003406 } else if (state == ServiceState.STATE_OUT_OF_SERVICE) {
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07003407 scanning = true;
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003408 strengthBin = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN;
Amith Yamasanif37447b2009-10-08 18:28:01 -07003409 if (!mPhoneSignalScanningTimer.isRunningLocked()) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003410 mHistoryCur.states |= HistoryItem.STATE_PHONE_SCANNING_FLAG;
Dianne Hackborne4a59512010-12-07 11:08:07 -08003411 newHistory = true;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003412 if (DEBUG_HISTORY) Slog.v(TAG, "Phone started scanning to: "
3413 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003414 mPhoneSignalScanningTimer.startRunningLocked(elapsedRealtime);
Amith Yamasanif37447b2009-10-08 18:28:01 -07003415 }
3416 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003417
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07003418 if (!scanning) {
3419 // If we are no longer scanning, then stop the scanning timer.
3420 if (mPhoneSignalScanningTimer.isRunningLocked()) {
3421 mHistoryCur.states &= ~HistoryItem.STATE_PHONE_SCANNING_FLAG;
3422 if (DEBUG_HISTORY) Slog.v(TAG, "Phone stopped scanning to: "
3423 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborne4a59512010-12-07 11:08:07 -08003424 newHistory = true;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003425 mPhoneSignalScanningTimer.stopRunningLocked(elapsedRealtime);
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07003426 }
3427 }
3428
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003429 if (mPhoneServiceState != state) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003430 mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_STATE_MASK)
3431 | (state << HistoryItem.STATE_PHONE_STATE_SHIFT);
Dianne Hackborne4a59512010-12-07 11:08:07 -08003432 if (DEBUG_HISTORY) Slog.v(TAG, "Phone state " + state + " to: "
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003433 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborne4a59512010-12-07 11:08:07 -08003434 newHistory = true;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003435 mPhoneServiceState = state;
3436 }
Dianne Hackborne4a59512010-12-07 11:08:07 -08003437
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003438 if (mPhoneSignalStrengthBin != strengthBin) {
Dianne Hackborne4a59512010-12-07 11:08:07 -08003439 if (mPhoneSignalStrengthBin >= 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003440 mPhoneSignalStrengthsTimer[mPhoneSignalStrengthBin].stopRunningLocked(
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003441 elapsedRealtime);
Dianne Hackborne4a59512010-12-07 11:08:07 -08003442 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003443 if (strengthBin >= 0) {
3444 if (!mPhoneSignalStrengthsTimer[strengthBin].isRunningLocked()) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003445 mPhoneSignalStrengthsTimer[strengthBin].startRunningLocked(elapsedRealtime);
Dianne Hackborne4a59512010-12-07 11:08:07 -08003446 }
Dianne Hackborn3251b902014-06-20 14:40:53 -07003447 mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_PHONE_SIGNAL_STRENGTH_MASK)
3448 | (strengthBin << HistoryItem.STATE_PHONE_SIGNAL_STRENGTH_SHIFT);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003449 if (DEBUG_HISTORY) Slog.v(TAG, "Signal strength " + strengthBin + " to: "
Dianne Hackborne4a59512010-12-07 11:08:07 -08003450 + Integer.toHexString(mHistoryCur.states));
3451 newHistory = true;
3452 } else {
Dianne Hackborn3251b902014-06-20 14:40:53 -07003453 stopAllPhoneSignalStrengthTimersLocked(-1);
Dianne Hackborne4a59512010-12-07 11:08:07 -08003454 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003455 mPhoneSignalStrengthBin = strengthBin;
Dianne Hackborne4a59512010-12-07 11:08:07 -08003456 }
3457
3458 if (newHistory) {
Dianne Hackborn40c87252014-03-19 16:55:40 -07003459 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborne4a59512010-12-07 11:08:07 -08003460 }
3461 }
3462
3463 /**
3464 * Telephony stack updates the phone state.
3465 * @param state phone state from ServiceState.getState()
3466 */
3467 public void notePhoneStateLocked(int state, int simState) {
3468 updateAllPhoneStateLocked(state, simState, mPhoneSignalStrengthBinRaw);
Amith Yamasani32dbefd2009-06-19 09:21:17 -07003469 }
3470
Wink Savillee9b06d72009-05-18 21:47:50 -07003471 public void notePhoneSignalStrengthLocked(SignalStrength signalStrength) {
Dianne Hackborn627bba72009-03-24 22:32:56 -07003472 // Bin the strength.
Wink Saville52840902011-02-18 12:40:47 -08003473 int bin = signalStrength.getLevel();
Dianne Hackborne4a59512010-12-07 11:08:07 -08003474 updateAllPhoneStateLocked(mPhoneServiceStateRaw, mPhoneSimStateRaw, bin);
Dianne Hackborn627bba72009-03-24 22:32:56 -07003475 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003476
Dianne Hackborn627bba72009-03-24 22:32:56 -07003477 public void notePhoneDataConnectionStateLocked(int dataType, boolean hasData) {
3478 int bin = DATA_CONNECTION_NONE;
3479 if (hasData) {
3480 switch (dataType) {
3481 case TelephonyManager.NETWORK_TYPE_EDGE:
3482 bin = DATA_CONNECTION_EDGE;
3483 break;
3484 case TelephonyManager.NETWORK_TYPE_GPRS:
3485 bin = DATA_CONNECTION_GPRS;
3486 break;
3487 case TelephonyManager.NETWORK_TYPE_UMTS:
3488 bin = DATA_CONNECTION_UMTS;
3489 break;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003490 case TelephonyManager.NETWORK_TYPE_CDMA:
3491 bin = DATA_CONNECTION_CDMA;
3492 break;
3493 case TelephonyManager.NETWORK_TYPE_EVDO_0:
3494 bin = DATA_CONNECTION_EVDO_0;
3495 break;
3496 case TelephonyManager.NETWORK_TYPE_EVDO_A:
3497 bin = DATA_CONNECTION_EVDO_A;
3498 break;
3499 case TelephonyManager.NETWORK_TYPE_1xRTT:
3500 bin = DATA_CONNECTION_1xRTT;
3501 break;
3502 case TelephonyManager.NETWORK_TYPE_HSDPA:
3503 bin = DATA_CONNECTION_HSDPA;
3504 break;
3505 case TelephonyManager.NETWORK_TYPE_HSUPA:
3506 bin = DATA_CONNECTION_HSUPA;
3507 break;
3508 case TelephonyManager.NETWORK_TYPE_HSPA:
3509 bin = DATA_CONNECTION_HSPA;
3510 break;
3511 case TelephonyManager.NETWORK_TYPE_IDEN:
3512 bin = DATA_CONNECTION_IDEN;
3513 break;
3514 case TelephonyManager.NETWORK_TYPE_EVDO_B:
3515 bin = DATA_CONNECTION_EVDO_B;
3516 break;
Robert Greenwalt962a9902010-11-02 11:10:25 -07003517 case TelephonyManager.NETWORK_TYPE_LTE:
3518 bin = DATA_CONNECTION_LTE;
3519 break;
3520 case TelephonyManager.NETWORK_TYPE_EHRPD:
3521 bin = DATA_CONNECTION_EHRPD;
3522 break;
Patrick Tjinb71703c2013-11-06 09:27:03 -08003523 case TelephonyManager.NETWORK_TYPE_HSPAP:
3524 bin = DATA_CONNECTION_HSPAP;
3525 break;
Dianne Hackborn627bba72009-03-24 22:32:56 -07003526 default:
3527 bin = DATA_CONNECTION_OTHER;
3528 break;
3529 }
3530 }
Amith Yamasani3718aaa2009-06-09 06:32:35 -07003531 if (DEBUG) Log.i(TAG, "Phone Data Connection -> " + dataType + " = " + hasData);
Dianne Hackborn627bba72009-03-24 22:32:56 -07003532 if (mPhoneDataConnectionType != bin) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003533 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003534 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003535 mHistoryCur.states = (mHistoryCur.states&~HistoryItem.STATE_DATA_CONNECTION_MASK)
3536 | (bin << HistoryItem.STATE_DATA_CONNECTION_SHIFT);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003537 if (DEBUG_HISTORY) Slog.v(TAG, "Data connection " + bin + " to: "
3538 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003539 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn627bba72009-03-24 22:32:56 -07003540 if (mPhoneDataConnectionType >= 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003541 mPhoneDataConnectionsTimer[mPhoneDataConnectionType].stopRunningLocked(
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003542 elapsedRealtime);
Dianne Hackborn627bba72009-03-24 22:32:56 -07003543 }
3544 mPhoneDataConnectionType = bin;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003545 mPhoneDataConnectionsTimer[bin].startRunningLocked(elapsedRealtime);
Dianne Hackborn627bba72009-03-24 22:32:56 -07003546 }
3547 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003548
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003549 public void noteWifiOnLocked() {
The Android Open Source Project10592532009-03-18 17:39:46 -07003550 if (!mWifiOn) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003551 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003552 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn3251b902014-06-20 14:40:53 -07003553 mHistoryCur.states2 |= HistoryItem.STATE2_WIFI_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003554 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI on to: "
3555 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003556 addHistoryRecordLocked(elapsedRealtime, uptime);
The Android Open Source Project10592532009-03-18 17:39:46 -07003557 mWifiOn = true;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003558 mWifiOnTimer.startRunningLocked(elapsedRealtime);
Adam Lesinskia7c90c82015-06-18 14:52:24 -07003559 scheduleSyncExternalWifiStatsLocked("wifi-off");
The Android Open Source Project10592532009-03-18 17:39:46 -07003560 }
3561 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003562
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003563 public void noteWifiOffLocked() {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003564 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003565 final long uptime = SystemClock.uptimeMillis();
The Android Open Source Project10592532009-03-18 17:39:46 -07003566 if (mWifiOn) {
Dianne Hackborn3251b902014-06-20 14:40:53 -07003567 mHistoryCur.states2 &= ~HistoryItem.STATE2_WIFI_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003568 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI off to: "
3569 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003570 addHistoryRecordLocked(elapsedRealtime, uptime);
The Android Open Source Project10592532009-03-18 17:39:46 -07003571 mWifiOn = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003572 mWifiOnTimer.stopRunningLocked(elapsedRealtime);
Adam Lesinskia7c90c82015-06-18 14:52:24 -07003573 scheduleSyncExternalWifiStatsLocked("wifi-on");
The Android Open Source Project10592532009-03-18 17:39:46 -07003574 }
3575 }
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003576
3577 public void noteAudioOnLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003578 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003579 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003580 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn10eaa852014-07-22 22:54:55 -07003581 if (mAudioOnNesting == 0) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003582 mHistoryCur.states |= HistoryItem.STATE_AUDIO_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003583 if (DEBUG_HISTORY) Slog.v(TAG, "Audio on to: "
3584 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003585 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003586 mAudioOnTimer.startRunningLocked(elapsedRealtime);
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003587 }
Dianne Hackborn10eaa852014-07-22 22:54:55 -07003588 mAudioOnNesting++;
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003589 getUidStatsLocked(uid).noteAudioTurnedOnLocked(elapsedRealtime);
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003590 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003591
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003592 public void noteAudioOffLocked(int uid) {
Dianne Hackborn10eaa852014-07-22 22:54:55 -07003593 if (mAudioOnNesting == 0) {
3594 return;
3595 }
Dianne Hackborn099bc622014-01-22 13:39:16 -08003596 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003597 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003598 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn10eaa852014-07-22 22:54:55 -07003599 if (--mAudioOnNesting == 0) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003600 mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003601 if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: "
3602 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003603 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003604 mAudioOnTimer.stopRunningLocked(elapsedRealtime);
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003605 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003606 getUidStatsLocked(uid).noteAudioTurnedOffLocked(elapsedRealtime);
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003607 }
3608
3609 public void noteVideoOnLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003610 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003611 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003612 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn10eaa852014-07-22 22:54:55 -07003613 if (mVideoOnNesting == 0) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07003614 mHistoryCur.states2 |= HistoryItem.STATE2_VIDEO_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003615 if (DEBUG_HISTORY) Slog.v(TAG, "Video on to: "
3616 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003617 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003618 mVideoOnTimer.startRunningLocked(elapsedRealtime);
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003619 }
Dianne Hackborn10eaa852014-07-22 22:54:55 -07003620 mVideoOnNesting++;
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003621 getUidStatsLocked(uid).noteVideoTurnedOnLocked(elapsedRealtime);
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003622 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003623
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003624 public void noteVideoOffLocked(int uid) {
Dianne Hackborn10eaa852014-07-22 22:54:55 -07003625 if (mVideoOnNesting == 0) {
3626 return;
3627 }
Dianne Hackborn099bc622014-01-22 13:39:16 -08003628 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003629 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003630 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn10eaa852014-07-22 22:54:55 -07003631 if (--mVideoOnNesting == 0) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07003632 mHistoryCur.states2 &= ~HistoryItem.STATE2_VIDEO_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003633 if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: "
3634 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003635 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003636 mVideoOnTimer.stopRunningLocked(elapsedRealtime);
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003637 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003638 getUidStatsLocked(uid).noteVideoTurnedOffLocked(elapsedRealtime);
Amith Yamasani244fa5c2009-05-22 14:36:07 -07003639 }
3640
Dianne Hackborn10eaa852014-07-22 22:54:55 -07003641 public void noteResetAudioLocked() {
3642 if (mAudioOnNesting > 0) {
3643 final long elapsedRealtime = SystemClock.elapsedRealtime();
3644 final long uptime = SystemClock.uptimeMillis();
3645 mAudioOnNesting = 0;
3646 mHistoryCur.states &= ~HistoryItem.STATE_AUDIO_ON_FLAG;
3647 if (DEBUG_HISTORY) Slog.v(TAG, "Audio off to: "
3648 + Integer.toHexString(mHistoryCur.states));
3649 addHistoryRecordLocked(elapsedRealtime, uptime);
3650 mAudioOnTimer.stopAllRunningLocked(elapsedRealtime);
3651 for (int i=0; i<mUidStats.size(); i++) {
3652 BatteryStatsImpl.Uid uid = mUidStats.valueAt(i);
3653 uid.noteResetAudioLocked(elapsedRealtime);
3654 }
3655 }
3656 }
3657
3658 public void noteResetVideoLocked() {
3659 if (mVideoOnNesting > 0) {
3660 final long elapsedRealtime = SystemClock.elapsedRealtime();
3661 final long uptime = SystemClock.uptimeMillis();
3662 mAudioOnNesting = 0;
3663 mHistoryCur.states2 &= ~HistoryItem.STATE2_VIDEO_ON_FLAG;
3664 if (DEBUG_HISTORY) Slog.v(TAG, "Video off to: "
3665 + Integer.toHexString(mHistoryCur.states));
3666 addHistoryRecordLocked(elapsedRealtime, uptime);
3667 mVideoOnTimer.stopAllRunningLocked(elapsedRealtime);
3668 for (int i=0; i<mUidStats.size(); i++) {
3669 BatteryStatsImpl.Uid uid = mUidStats.valueAt(i);
3670 uid.noteResetVideoLocked(elapsedRealtime);
3671 }
3672 }
3673 }
3674
Jeff Sharkey3e013e82013-04-25 14:48:19 -07003675 public void noteActivityResumedLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003676 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003677 getUidStatsLocked(uid).noteActivityResumedLocked(SystemClock.elapsedRealtime());
Jeff Sharkey3e013e82013-04-25 14:48:19 -07003678 }
3679
3680 public void noteActivityPausedLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003681 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003682 getUidStatsLocked(uid).noteActivityPausedLocked(SystemClock.elapsedRealtime());
Jeff Sharkey3e013e82013-04-25 14:48:19 -07003683 }
3684
Dianne Hackborna06de0f2012-12-11 16:34:47 -08003685 public void noteVibratorOnLocked(int uid, long durationMillis) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003686 uid = mapUid(uid);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08003687 getUidStatsLocked(uid).noteVibratorOnLocked(durationMillis);
3688 }
3689
3690 public void noteVibratorOffLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003691 uid = mapUid(uid);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08003692 getUidStatsLocked(uid).noteVibratorOffLocked();
3693 }
3694
Ruben Brunk6d2c3632015-05-26 17:32:16 -07003695 public void noteFlashlightOnLocked(int uid) {
3696 uid = mapUid(uid);
3697 final long elapsedRealtime = SystemClock.elapsedRealtime();
3698 final long uptime = SystemClock.uptimeMillis();
3699 if (mFlashlightOnNesting++ == 0) {
Dianne Hackbornabc7c492014-06-30 16:57:46 -07003700 mHistoryCur.states2 |= HistoryItem.STATE2_FLASHLIGHT_FLAG;
3701 if (DEBUG_HISTORY) Slog.v(TAG, "Flashlight on to: "
Ruben Brunk6d2c3632015-05-26 17:32:16 -07003702 + Integer.toHexString(mHistoryCur.states2));
Dianne Hackbornabc7c492014-06-30 16:57:46 -07003703 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackbornabc7c492014-06-30 16:57:46 -07003704 mFlashlightOnTimer.startRunningLocked(elapsedRealtime);
3705 }
Ruben Brunk6d2c3632015-05-26 17:32:16 -07003706 getUidStatsLocked(uid).noteFlashlightTurnedOnLocked(elapsedRealtime);
3707 }
3708
3709 public void noteFlashlightOffLocked(int uid) {
3710 if (mFlashlightOnNesting == 0) {
3711 return;
3712 }
3713 uid = mapUid(uid);
3714 final long elapsedRealtime = SystemClock.elapsedRealtime();
3715 final long uptime = SystemClock.uptimeMillis();
3716 if (--mFlashlightOnNesting == 0) {
3717 mHistoryCur.states2 &= ~HistoryItem.STATE2_FLASHLIGHT_FLAG;
3718 if (DEBUG_HISTORY) Slog.v(TAG, "Flashlight off to: "
3719 + Integer.toHexString(mHistoryCur.states2));
3720 addHistoryRecordLocked(elapsedRealtime, uptime);
3721 mFlashlightOnTimer.stopRunningLocked(elapsedRealtime);
3722 }
3723 getUidStatsLocked(uid).noteFlashlightTurnedOffLocked(elapsedRealtime);
3724 }
3725
3726 public void noteCameraOnLocked(int uid) {
3727 uid = mapUid(uid);
3728 final long elapsedRealtime = SystemClock.elapsedRealtime();
3729 final long uptime = SystemClock.uptimeMillis();
3730 if (mCameraOnNesting++ == 0) {
3731 mHistoryCur.states2 |= HistoryItem.STATE2_CAMERA_FLAG;
3732 if (DEBUG_HISTORY) Slog.v(TAG, "Camera on to: "
3733 + Integer.toHexString(mHistoryCur.states2));
3734 addHistoryRecordLocked(elapsedRealtime, uptime);
3735 mCameraOnTimer.startRunningLocked(elapsedRealtime);
3736 }
3737 getUidStatsLocked(uid).noteCameraTurnedOnLocked(elapsedRealtime);
3738 }
3739
3740 public void noteCameraOffLocked(int uid) {
3741 if (mCameraOnNesting == 0) {
3742 return;
3743 }
3744 uid = mapUid(uid);
3745 final long elapsedRealtime = SystemClock.elapsedRealtime();
3746 final long uptime = SystemClock.uptimeMillis();
3747 if (--mCameraOnNesting == 0) {
3748 mHistoryCur.states2 &= ~HistoryItem.STATE2_CAMERA_FLAG;
3749 if (DEBUG_HISTORY) Slog.v(TAG, "Camera off to: "
3750 + Integer.toHexString(mHistoryCur.states2));
3751 addHistoryRecordLocked(elapsedRealtime, uptime);
3752 mCameraOnTimer.stopRunningLocked(elapsedRealtime);
3753 }
3754 getUidStatsLocked(uid).noteCameraTurnedOffLocked(elapsedRealtime);
3755 }
3756
3757 public void noteResetCameraLocked() {
3758 if (mCameraOnNesting > 0) {
3759 final long elapsedRealtime = SystemClock.elapsedRealtime();
3760 final long uptime = SystemClock.uptimeMillis();
3761 mCameraOnNesting = 0;
3762 mHistoryCur.states2 &= ~HistoryItem.STATE2_CAMERA_FLAG;
3763 if (DEBUG_HISTORY) Slog.v(TAG, "Camera off to: "
3764 + Integer.toHexString(mHistoryCur.states2));
3765 addHistoryRecordLocked(elapsedRealtime, uptime);
3766 mCameraOnTimer.stopAllRunningLocked(elapsedRealtime);
3767 for (int i=0; i<mUidStats.size(); i++) {
3768 BatteryStatsImpl.Uid uid = mUidStats.valueAt(i);
3769 uid.noteResetCameraLocked(elapsedRealtime);
3770 }
3771 }
Dianne Hackbornabc7c492014-06-30 16:57:46 -07003772 }
3773
Ruben Brunk6d2c3632015-05-26 17:32:16 -07003774 public void noteResetFlashlightLocked() {
3775 if (mFlashlightOnNesting > 0) {
3776 final long elapsedRealtime = SystemClock.elapsedRealtime();
3777 final long uptime = SystemClock.uptimeMillis();
3778 mFlashlightOnNesting = 0;
Dianne Hackbornabc7c492014-06-30 16:57:46 -07003779 mHistoryCur.states2 &= ~HistoryItem.STATE2_FLASHLIGHT_FLAG;
3780 if (DEBUG_HISTORY) Slog.v(TAG, "Flashlight off to: "
Ruben Brunk6d2c3632015-05-26 17:32:16 -07003781 + Integer.toHexString(mHistoryCur.states2));
Dianne Hackbornabc7c492014-06-30 16:57:46 -07003782 addHistoryRecordLocked(elapsedRealtime, uptime);
Ruben Brunk6d2c3632015-05-26 17:32:16 -07003783 mFlashlightOnTimer.stopAllRunningLocked(elapsedRealtime);
3784 for (int i=0; i<mUidStats.size(); i++) {
3785 BatteryStatsImpl.Uid uid = mUidStats.valueAt(i);
3786 uid.noteResetFlashlightLocked(elapsedRealtime);
3787 }
Dianne Hackbornabc7c492014-06-30 16:57:46 -07003788 }
3789 }
3790
Dianne Hackborn0c820db2015-04-14 17:47:34 -07003791 public void noteWifiRadioPowerState(int powerState, long timestampNs) {
3792 final long elapsedRealtime = SystemClock.elapsedRealtime();
3793 final long uptime = SystemClock.uptimeMillis();
3794 if (mWifiRadioPowerState != powerState) {
3795 final boolean active =
3796 powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM
3797 || powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH;
3798 if (active) {
3799 mHistoryCur.states |= HistoryItem.STATE_WIFI_RADIO_ACTIVE_FLAG;
3800 } else {
3801 mHistoryCur.states &= ~HistoryItem.STATE_WIFI_RADIO_ACTIVE_FLAG;
3802 }
3803 if (DEBUG_HISTORY) Slog.v(TAG, "Wifi network active " + active + " to: "
3804 + Integer.toHexString(mHistoryCur.states));
3805 addHistoryRecordLocked(elapsedRealtime, uptime);
3806 mWifiRadioPowerState = powerState;
3807 }
3808 }
3809
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003810 public void noteWifiRunningLocked(WorkSource ws) {
3811 if (!mGlobalWifiRunning) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003812 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003813 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn3251b902014-06-20 14:40:53 -07003814 mHistoryCur.states2 |= HistoryItem.STATE2_WIFI_RUNNING_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003815 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI running to: "
3816 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003817 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003818 mGlobalWifiRunning = true;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003819 mGlobalWifiRunningTimer.startRunningLocked(elapsedRealtime);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003820 int N = ws.size();
3821 for (int i=0; i<N; i++) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003822 int uid = mapUid(ws.get(i));
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003823 getUidStatsLocked(uid).noteWifiRunningLocked(elapsedRealtime);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003824 }
Adam Lesinskia7c90c82015-06-18 14:52:24 -07003825 scheduleSyncExternalWifiStatsLocked("wifi-running");
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003826 } else {
3827 Log.w(TAG, "noteWifiRunningLocked -- called while WIFI running");
Eric Shienbroodd4c5f892009-03-24 18:13:20 -07003828 }
3829 }
3830
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003831 public void noteWifiRunningChangedLocked(WorkSource oldWs, WorkSource newWs) {
3832 if (mGlobalWifiRunning) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003833 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003834 int N = oldWs.size();
3835 for (int i=0; i<N; i++) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003836 int uid = mapUid(oldWs.get(i));
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003837 getUidStatsLocked(uid).noteWifiStoppedLocked(elapsedRealtime);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003838 }
3839 N = newWs.size();
3840 for (int i=0; i<N; i++) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003841 int uid = mapUid(newWs.get(i));
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003842 getUidStatsLocked(uid).noteWifiRunningLocked(elapsedRealtime);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003843 }
3844 } else {
3845 Log.w(TAG, "noteWifiRunningChangedLocked -- called while WIFI not running");
3846 }
3847 }
3848
3849 public void noteWifiStoppedLocked(WorkSource ws) {
3850 if (mGlobalWifiRunning) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003851 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003852 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn3251b902014-06-20 14:40:53 -07003853 mHistoryCur.states2 &= ~HistoryItem.STATE2_WIFI_RUNNING_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003854 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI stopped to: "
3855 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003856 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003857 mGlobalWifiRunning = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003858 mGlobalWifiRunningTimer.stopRunningLocked(elapsedRealtime);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003859 int N = ws.size();
3860 for (int i=0; i<N; i++) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003861 int uid = mapUid(ws.get(i));
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003862 getUidStatsLocked(uid).noteWifiStoppedLocked(elapsedRealtime);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003863 }
Adam Lesinskia7c90c82015-06-18 14:52:24 -07003864 scheduleSyncExternalWifiStatsLocked("wifi-stopped");
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07003865 } else {
3866 Log.w(TAG, "noteWifiStoppedLocked -- called while WIFI not running");
Eric Shienbroodd4c5f892009-03-24 18:13:20 -07003867 }
3868 }
3869
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003870 public void noteWifiStateLocked(int wifiState, String accessPoint) {
3871 if (DEBUG) Log.i(TAG, "WiFi state -> " + wifiState);
3872 if (mWifiState != wifiState) {
3873 final long elapsedRealtime = SystemClock.elapsedRealtime();
3874 if (mWifiState >= 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003875 mWifiStateTimer[mWifiState].stopRunningLocked(elapsedRealtime);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003876 }
3877 mWifiState = wifiState;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08003878 mWifiStateTimer[wifiState].startRunningLocked(elapsedRealtime);
Adam Lesinskia7c90c82015-06-18 14:52:24 -07003879 scheduleSyncExternalWifiStatsLocked("wifi-state");
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003880 }
3881 }
3882
Dianne Hackborn3251b902014-06-20 14:40:53 -07003883 public void noteWifiSupplicantStateChangedLocked(int supplState, boolean failedAuth) {
3884 if (DEBUG) Log.i(TAG, "WiFi suppl state -> " + supplState);
3885 if (mWifiSupplState != supplState) {
3886 final long elapsedRealtime = SystemClock.elapsedRealtime();
3887 final long uptime = SystemClock.uptimeMillis();
3888 if (mWifiSupplState >= 0) {
3889 mWifiSupplStateTimer[mWifiSupplState].stopRunningLocked(elapsedRealtime);
3890 }
3891 mWifiSupplState = supplState;
3892 mWifiSupplStateTimer[supplState].startRunningLocked(elapsedRealtime);
3893 mHistoryCur.states2 =
3894 (mHistoryCur.states2&~HistoryItem.STATE2_WIFI_SUPPL_STATE_MASK)
3895 | (supplState << HistoryItem.STATE2_WIFI_SUPPL_STATE_SHIFT);
3896 if (DEBUG_HISTORY) Slog.v(TAG, "Wifi suppl state " + supplState + " to: "
3897 + Integer.toHexString(mHistoryCur.states2));
3898 addHistoryRecordLocked(elapsedRealtime, uptime);
3899 }
3900 }
3901
3902 void stopAllWifiSignalStrengthTimersLocked(int except) {
3903 final long elapsedRealtime = SystemClock.elapsedRealtime();
3904 for (int i = 0; i < NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
3905 if (i == except) {
3906 continue;
3907 }
3908 while (mWifiSignalStrengthsTimer[i].isRunningLocked()) {
3909 mWifiSignalStrengthsTimer[i].stopRunningLocked(elapsedRealtime);
3910 }
3911 }
3912 }
3913
3914 public void noteWifiRssiChangedLocked(int newRssi) {
3915 int strengthBin = WifiManager.calculateSignalLevel(newRssi, NUM_WIFI_SIGNAL_STRENGTH_BINS);
3916 if (DEBUG) Log.i(TAG, "WiFi rssi -> " + newRssi + " bin=" + strengthBin);
3917 if (mWifiSignalStrengthBin != strengthBin) {
3918 final long elapsedRealtime = SystemClock.elapsedRealtime();
3919 final long uptime = SystemClock.uptimeMillis();
3920 if (mWifiSignalStrengthBin >= 0) {
3921 mWifiSignalStrengthsTimer[mWifiSignalStrengthBin].stopRunningLocked(
3922 elapsedRealtime);
3923 }
3924 if (strengthBin >= 0) {
3925 if (!mWifiSignalStrengthsTimer[strengthBin].isRunningLocked()) {
3926 mWifiSignalStrengthsTimer[strengthBin].startRunningLocked(elapsedRealtime);
3927 }
3928 mHistoryCur.states2 =
3929 (mHistoryCur.states2&~HistoryItem.STATE2_WIFI_SIGNAL_STRENGTH_MASK)
3930 | (strengthBin << HistoryItem.STATE2_WIFI_SIGNAL_STRENGTH_SHIFT);
3931 if (DEBUG_HISTORY) Slog.v(TAG, "Wifi signal strength " + strengthBin + " to: "
3932 + Integer.toHexString(mHistoryCur.states2));
3933 addHistoryRecordLocked(elapsedRealtime, uptime);
3934 } else {
3935 stopAllWifiSignalStrengthTimersLocked(-1);
3936 }
3937 mWifiSignalStrengthBin = strengthBin;
3938 }
3939 }
3940
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003941 int mWifiFullLockNesting = 0;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003942
The Android Open Source Project10592532009-03-18 17:39:46 -07003943 public void noteFullWifiLockAcquiredLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003944 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003945 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003946 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003947 if (mWifiFullLockNesting == 0) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003948 mHistoryCur.states |= HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003949 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock on to: "
3950 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003951 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003952 }
3953 mWifiFullLockNesting++;
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003954 getUidStatsLocked(uid).noteFullWifiLockAcquiredLocked(elapsedRealtime);
The Android Open Source Project10592532009-03-18 17:39:46 -07003955 }
3956
3957 public void noteFullWifiLockReleasedLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003958 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003959 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003960 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003961 mWifiFullLockNesting--;
3962 if (mWifiFullLockNesting == 0) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07003963 mHistoryCur.states &= ~HistoryItem.STATE_WIFI_FULL_LOCK_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003964 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI full lock off to: "
3965 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003966 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003967 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003968 getUidStatsLocked(uid).noteFullWifiLockReleasedLocked(elapsedRealtime);
The Android Open Source Project10592532009-03-18 17:39:46 -07003969 }
3970
Nick Pelly6ccaa542012-06-15 15:22:47 -07003971 int mWifiScanNesting = 0;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07003972
Nick Pelly6ccaa542012-06-15 15:22:47 -07003973 public void noteWifiScanStartedLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003974 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003975 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003976 final long uptime = SystemClock.uptimeMillis();
Nick Pelly6ccaa542012-06-15 15:22:47 -07003977 if (mWifiScanNesting == 0) {
3978 mHistoryCur.states |= HistoryItem.STATE_WIFI_SCAN_FLAG;
3979 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan started for: "
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003980 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003981 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003982 }
Nick Pelly6ccaa542012-06-15 15:22:47 -07003983 mWifiScanNesting++;
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003984 getUidStatsLocked(uid).noteWifiScanStartedLocked(elapsedRealtime);
The Android Open Source Project10592532009-03-18 17:39:46 -07003985 }
3986
Nick Pelly6ccaa542012-06-15 15:22:47 -07003987 public void noteWifiScanStoppedLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08003988 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003989 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07003990 final long uptime = SystemClock.uptimeMillis();
Nick Pelly6ccaa542012-06-15 15:22:47 -07003991 mWifiScanNesting--;
3992 if (mWifiScanNesting == 0) {
3993 mHistoryCur.states &= ~HistoryItem.STATE_WIFI_SCAN_FLAG;
3994 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI scan stopped for: "
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003995 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07003996 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07003997 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08003998 getUidStatsLocked(uid).noteWifiScanStoppedLocked(elapsedRealtime);
The Android Open Source Project10592532009-03-18 17:39:46 -07003999 }
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004000
Robert Greenwalta029ea12013-09-25 16:38:12 -07004001 public void noteWifiBatchedScanStartedLocked(int uid, int csph) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08004002 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08004003 final long elapsedRealtime = SystemClock.elapsedRealtime();
4004 getUidStatsLocked(uid).noteWifiBatchedScanStartedLocked(csph, elapsedRealtime);
Robert Greenwalta029ea12013-09-25 16:38:12 -07004005 }
4006
4007 public void noteWifiBatchedScanStoppedLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08004008 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08004009 final long elapsedRealtime = SystemClock.elapsedRealtime();
4010 getUidStatsLocked(uid).noteWifiBatchedScanStoppedLocked(elapsedRealtime);
Robert Greenwalta029ea12013-09-25 16:38:12 -07004011 }
4012
Dianne Hackborn32907cf2010-06-10 17:50:20 -07004013 int mWifiMulticastNesting = 0;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004014
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004015 public void noteWifiMulticastEnabledLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08004016 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08004017 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07004018 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn32907cf2010-06-10 17:50:20 -07004019 if (mWifiMulticastNesting == 0) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004020 mHistoryCur.states |= HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07004021 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast on to: "
4022 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07004023 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07004024 }
4025 mWifiMulticastNesting++;
Dianne Hackbornca1bf212014-02-14 14:18:36 -08004026 getUidStatsLocked(uid).noteWifiMulticastEnabledLocked(elapsedRealtime);
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004027 }
4028
4029 public void noteWifiMulticastDisabledLocked(int uid) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08004030 uid = mapUid(uid);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08004031 final long elapsedRealtime = SystemClock.elapsedRealtime();
Dianne Hackborn40c87252014-03-19 16:55:40 -07004032 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborn32907cf2010-06-10 17:50:20 -07004033 mWifiMulticastNesting--;
4034 if (mWifiMulticastNesting == 0) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004035 mHistoryCur.states &= ~HistoryItem.STATE_WIFI_MULTICAST_ON_FLAG;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07004036 if (DEBUG_HISTORY) Slog.v(TAG, "WIFI multicast off to: "
4037 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07004038 addHistoryRecordLocked(elapsedRealtime, uptime);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07004039 }
Dianne Hackbornca1bf212014-02-14 14:18:36 -08004040 getUidStatsLocked(uid).noteWifiMulticastDisabledLocked(elapsedRealtime);
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004041 }
4042
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07004043 public void noteFullWifiLockAcquiredFromSourceLocked(WorkSource ws) {
4044 int N = ws.size();
4045 for (int i=0; i<N; i++) {
4046 noteFullWifiLockAcquiredLocked(ws.get(i));
4047 }
4048 }
4049
4050 public void noteFullWifiLockReleasedFromSourceLocked(WorkSource ws) {
4051 int N = ws.size();
4052 for (int i=0; i<N; i++) {
4053 noteFullWifiLockReleasedLocked(ws.get(i));
4054 }
4055 }
4056
Nick Pelly6ccaa542012-06-15 15:22:47 -07004057 public void noteWifiScanStartedFromSourceLocked(WorkSource ws) {
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07004058 int N = ws.size();
4059 for (int i=0; i<N; i++) {
Nick Pelly6ccaa542012-06-15 15:22:47 -07004060 noteWifiScanStartedLocked(ws.get(i));
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07004061 }
4062 }
4063
Nick Pelly6ccaa542012-06-15 15:22:47 -07004064 public void noteWifiScanStoppedFromSourceLocked(WorkSource ws) {
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07004065 int N = ws.size();
4066 for (int i=0; i<N; i++) {
Nick Pelly6ccaa542012-06-15 15:22:47 -07004067 noteWifiScanStoppedLocked(ws.get(i));
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07004068 }
4069 }
4070
Robert Greenwalta029ea12013-09-25 16:38:12 -07004071 public void noteWifiBatchedScanStartedFromSourceLocked(WorkSource ws, int csph) {
4072 int N = ws.size();
4073 for (int i=0; i<N; i++) {
4074 noteWifiBatchedScanStartedLocked(ws.get(i), csph);
4075 }
4076 }
4077
4078 public void noteWifiBatchedScanStoppedFromSourceLocked(WorkSource ws) {
4079 int N = ws.size();
4080 for (int i=0; i<N; i++) {
4081 noteWifiBatchedScanStoppedLocked(ws.get(i));
4082 }
4083 }
4084
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -07004085 public void noteWifiMulticastEnabledFromSourceLocked(WorkSource ws) {
4086 int N = ws.size();
4087 for (int i=0; i<N; i++) {
4088 noteWifiMulticastEnabledLocked(ws.get(i));
4089 }
4090 }
4091
4092 public void noteWifiMulticastDisabledFromSourceLocked(WorkSource ws) {
4093 int N = ws.size();
4094 for (int i=0; i<N; i++) {
4095 noteWifiMulticastDisabledLocked(ws.get(i));
4096 }
4097 }
4098
Dianne Hackbornd0c5b9a2014-02-21 16:19:05 -08004099 private static String[] includeInStringArray(String[] array, String str) {
4100 if (ArrayUtils.indexOf(array, str) >= 0) {
4101 return array;
4102 }
4103 String[] newArray = new String[array.length+1];
4104 System.arraycopy(array, 0, newArray, 0, array.length);
4105 newArray[array.length] = str;
4106 return newArray;
4107 }
4108
4109 private static String[] excludeFromStringArray(String[] array, String str) {
4110 int index = ArrayUtils.indexOf(array, str);
4111 if (index >= 0) {
4112 String[] newArray = new String[array.length-1];
4113 if (index > 0) {
4114 System.arraycopy(array, 0, newArray, 0, index);
4115 }
4116 if (index < array.length-1) {
4117 System.arraycopy(array, index+1, newArray, index, array.length-index-1);
4118 }
4119 return newArray;
4120 }
4121 return array;
4122 }
4123
Jeff Sharkey1059c3c2011-10-04 16:54:49 -07004124 public void noteNetworkInterfaceTypeLocked(String iface, int networkType) {
Jeff Sharkey9da2f1e2014-08-14 12:55:00 -07004125 if (TextUtils.isEmpty(iface)) return;
Jeff Sharkey1059c3c2011-10-04 16:54:49 -07004126 if (ConnectivityManager.isNetworkTypeMobile(networkType)) {
Dianne Hackbornd0c5b9a2014-02-21 16:19:05 -08004127 mMobileIfaces = includeInStringArray(mMobileIfaces, iface);
4128 if (DEBUG) Slog.d(TAG, "Note mobile iface " + iface + ": " + mMobileIfaces);
Jeff Sharkey1059c3c2011-10-04 16:54:49 -07004129 } else {
Dianne Hackbornd0c5b9a2014-02-21 16:19:05 -08004130 mMobileIfaces = excludeFromStringArray(mMobileIfaces, iface);
4131 if (DEBUG) Slog.d(TAG, "Note non-mobile iface " + iface + ": " + mMobileIfaces);
Jeff Sharkey1059c3c2011-10-04 16:54:49 -07004132 }
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07004133 if (ConnectivityManager.isNetworkTypeWifi(networkType)) {
Dianne Hackbornd0c5b9a2014-02-21 16:19:05 -08004134 mWifiIfaces = includeInStringArray(mWifiIfaces, iface);
4135 if (DEBUG) Slog.d(TAG, "Note wifi iface " + iface + ": " + mWifiIfaces);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07004136 } else {
Dianne Hackbornd0c5b9a2014-02-21 16:19:05 -08004137 mWifiIfaces = excludeFromStringArray(mWifiIfaces, iface);
4138 if (DEBUG) Slog.d(TAG, "Note non-wifi iface " + iface + ": " + mWifiIfaces);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07004139 }
4140 }
4141
4142 public void noteNetworkStatsEnabledLocked() {
4143 // During device boot, qtaguid isn't enabled until after the inital
4144 // loading of battery stats. Now that they're enabled, take our initial
4145 // snapshot for future delta calculation.
Adam Lesinskie08af192015-03-25 16:42:59 -07004146 final long elapsedRealtimeMs = SystemClock.elapsedRealtime();
4147 updateMobileRadioStateLocked(elapsedRealtimeMs);
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07004148 updateWifiStateLocked(null);
Jeff Sharkey1059c3c2011-10-04 16:54:49 -07004149 }
4150
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004151 @Override public long getScreenOnTime(long elapsedRealtimeUs, int which) {
4152 return mScreenOnTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004153 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004154
Dianne Hackborn77b987f2014-02-26 16:20:52 -08004155 @Override public int getScreenOnCount(int which) {
4156 return mScreenOnTimer.getCountLocked(which);
4157 }
4158
Dianne Hackborn617f8772009-03-31 15:04:46 -07004159 @Override public long getScreenBrightnessTime(int brightnessBin,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004160 long elapsedRealtimeUs, int which) {
Evan Millarc64edde2009-04-18 12:26:32 -07004161 return mScreenBrightnessTimer[brightnessBin].getTotalTimeLocked(
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004162 elapsedRealtimeUs, which);
Dianne Hackborn617f8772009-03-31 15:04:46 -07004163 }
Amith Yamasani244fa5c2009-05-22 14:36:07 -07004164
Jeff Browne95c3cd2014-05-02 16:59:26 -07004165 @Override public long getInteractiveTime(long elapsedRealtimeUs, int which) {
4166 return mInteractiveTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
Dianne Hackborn617f8772009-03-31 15:04:46 -07004167 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004168
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07004169 @Override public long getPowerSaveModeEnabledTime(long elapsedRealtimeUs, int which) {
4170 return mPowerSaveModeEnabledTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07004171 }
4172
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07004173 @Override public int getPowerSaveModeEnabledCount(int which) {
4174 return mPowerSaveModeEnabledTimer.getCountLocked(which);
4175 }
4176
Dianne Hackborn08c47a52015-10-15 12:38:14 -07004177 @Override public long getDeviceIdleModeTime(int mode, long elapsedRealtimeUs,
4178 int which) {
4179 switch (mode) {
4180 case DEVICE_IDLE_MODE_LIGHT:
4181 return mDeviceIdleModeLightTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
4182 case DEVICE_IDLE_MODE_FULL:
4183 return mDeviceIdleModeFullTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
4184 }
4185 return 0;
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07004186 }
4187
Dianne Hackborn08c47a52015-10-15 12:38:14 -07004188 @Override public int getDeviceIdleModeCount(int mode, int which) {
4189 switch (mode) {
4190 case DEVICE_IDLE_MODE_LIGHT:
4191 return mDeviceIdleModeLightTimer.getCountLocked(which);
4192 case DEVICE_IDLE_MODE_FULL:
4193 return mDeviceIdleModeFullTimer.getCountLocked(which);
4194 }
4195 return 0;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07004196 }
4197
Dianne Hackborn08c47a52015-10-15 12:38:14 -07004198 @Override public long getLongestDeviceIdleModeTime(int mode) {
4199 switch (mode) {
4200 case DEVICE_IDLE_MODE_LIGHT:
4201 return mLongestLightIdleTime;
4202 case DEVICE_IDLE_MODE_FULL:
4203 return mLongestFullIdleTime;
4204 }
4205 return 0;
Dianne Hackborn88e98df2015-03-23 13:29:14 -07004206 }
4207
Dianne Hackborn08c47a52015-10-15 12:38:14 -07004208 @Override public long getDeviceIdlingTime(int mode, long elapsedRealtimeUs, int which) {
4209 switch (mode) {
4210 case DEVICE_IDLE_MODE_LIGHT:
4211 return mDeviceLightIdlingTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
4212 case DEVICE_IDLE_MODE_FULL:
4213 return mDeviceIdlingTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
4214 }
4215 return 0;
4216 }
4217
4218 @Override public int getDeviceIdlingCount(int mode, int which) {
4219 switch (mode) {
4220 case DEVICE_IDLE_MODE_LIGHT:
4221 return mDeviceLightIdlingTimer.getCountLocked(which);
4222 case DEVICE_IDLE_MODE_FULL:
4223 return mDeviceIdlingTimer.getCountLocked(which);
4224 }
4225 return 0;
Dianne Hackborn88e98df2015-03-23 13:29:14 -07004226 }
4227
Dianne Hackborn1e01d162014-12-04 17:46:42 -08004228 @Override public int getNumConnectivityChange(int which) {
4229 int val = mNumConnectivityChange;
4230 if (which == STATS_CURRENT) {
4231 val -= mLoadedNumConnectivityChange;
4232 } else if (which == STATS_SINCE_UNPLUGGED) {
4233 val -= mUnpluggedNumConnectivityChange;
4234 }
4235 return val;
4236 }
4237
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004238 @Override public long getPhoneOnTime(long elapsedRealtimeUs, int which) {
4239 return mPhoneOnTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004240 }
Amith Yamasani244fa5c2009-05-22 14:36:07 -07004241
Dianne Hackborn77b987f2014-02-26 16:20:52 -08004242 @Override public int getPhoneOnCount(int which) {
4243 return mPhoneOnTimer.getCountLocked(which);
4244 }
4245
Dianne Hackborn627bba72009-03-24 22:32:56 -07004246 @Override public long getPhoneSignalStrengthTime(int strengthBin,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004247 long elapsedRealtimeUs, int which) {
Evan Millarc64edde2009-04-18 12:26:32 -07004248 return mPhoneSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004249 elapsedRealtimeUs, which);
Dianne Hackborn627bba72009-03-24 22:32:56 -07004250 }
Amith Yamasanif37447b2009-10-08 18:28:01 -07004251
4252 @Override public long getPhoneSignalScanningTime(
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004253 long elapsedRealtimeUs, int which) {
Amith Yamasanif37447b2009-10-08 18:28:01 -07004254 return mPhoneSignalScanningTimer.getTotalTimeLocked(
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004255 elapsedRealtimeUs, which);
Amith Yamasanif37447b2009-10-08 18:28:01 -07004256 }
4257
Catherine Liufb900812012-07-17 14:12:56 -05004258 @Override public int getPhoneSignalStrengthCount(int strengthBin, int which) {
4259 return mPhoneSignalStrengthsTimer[strengthBin].getCountLocked(which);
Dianne Hackborn617f8772009-03-31 15:04:46 -07004260 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004261
Dianne Hackborn627bba72009-03-24 22:32:56 -07004262 @Override public long getPhoneDataConnectionTime(int dataType,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004263 long elapsedRealtimeUs, int which) {
Evan Millarc64edde2009-04-18 12:26:32 -07004264 return mPhoneDataConnectionsTimer[dataType].getTotalTimeLocked(
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004265 elapsedRealtimeUs, which);
Dianne Hackborn627bba72009-03-24 22:32:56 -07004266 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004267
Dianne Hackborn617f8772009-03-31 15:04:46 -07004268 @Override public int getPhoneDataConnectionCount(int dataType, int which) {
Evan Millarc64edde2009-04-18 12:26:32 -07004269 return mPhoneDataConnectionsTimer[dataType].getCountLocked(which);
Dianne Hackborn617f8772009-03-31 15:04:46 -07004270 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004271
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004272 @Override public long getMobileRadioActiveTime(long elapsedRealtimeUs, int which) {
4273 return mMobileRadioActiveTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
Dianne Hackborne13c4c02014-02-11 17:18:35 -08004274 }
4275
Dianne Hackbornd45665b2014-02-26 12:35:32 -08004276 @Override public int getMobileRadioActiveCount(int which) {
4277 return mMobileRadioActiveTimer.getCountLocked(which);
4278 }
4279
Dianne Hackborna1bd7922014-03-21 11:07:11 -07004280 @Override public long getMobileRadioActiveAdjustedTime(int which) {
4281 return mMobileRadioActiveAdjustedTime.getCountLocked(which);
4282 }
4283
Dianne Hackbornd45665b2014-02-26 12:35:32 -08004284 @Override public long getMobileRadioActiveUnknownTime(int which) {
4285 return mMobileRadioActiveUnknownTime.getCountLocked(which);
4286 }
4287
4288 @Override public int getMobileRadioActiveUnknownCount(int which) {
4289 return (int)mMobileRadioActiveUnknownCount.getCountLocked(which);
4290 }
4291
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004292 @Override public long getWifiOnTime(long elapsedRealtimeUs, int which) {
4293 return mWifiOnTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
The Android Open Source Project10592532009-03-18 17:39:46 -07004294 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004295
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004296 @Override public long getGlobalWifiRunningTime(long elapsedRealtimeUs, int which) {
4297 return mGlobalWifiRunningTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
Eric Shienbroodd4c5f892009-03-24 18:13:20 -07004298 }
4299
Dianne Hackbornca1bf212014-02-14 14:18:36 -08004300 @Override public long getWifiStateTime(int wifiState,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004301 long elapsedRealtimeUs, int which) {
Dianne Hackbornca1bf212014-02-14 14:18:36 -08004302 return mWifiStateTimer[wifiState].getTotalTimeLocked(
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004303 elapsedRealtimeUs, which);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08004304 }
4305
4306 @Override public int getWifiStateCount(int wifiState, int which) {
4307 return mWifiStateTimer[wifiState].getCountLocked(which);
4308 }
4309
Dianne Hackborn3251b902014-06-20 14:40:53 -07004310 @Override public long getWifiSupplStateTime(int state,
4311 long elapsedRealtimeUs, int which) {
4312 return mWifiSupplStateTimer[state].getTotalTimeLocked(
4313 elapsedRealtimeUs, which);
4314 }
4315
4316 @Override public int getWifiSupplStateCount(int state, int which) {
4317 return mWifiSupplStateTimer[state].getCountLocked(which);
4318 }
4319
4320 @Override public long getWifiSignalStrengthTime(int strengthBin,
4321 long elapsedRealtimeUs, int which) {
4322 return mWifiSignalStrengthsTimer[strengthBin].getTotalTimeLocked(
4323 elapsedRealtimeUs, which);
4324 }
4325
4326 @Override public int getWifiSignalStrengthCount(int strengthBin, int which) {
4327 return mWifiSignalStrengthsTimer[strengthBin].getCountLocked(which);
4328 }
4329
Adam Lesinski17390762015-04-10 13:17:47 -07004330 @Override public boolean hasBluetoothActivityReporting() {
4331 return mHasBluetoothEnergyReporting;
4332 }
4333
Adam Lesinski33dac552015-03-09 15:24:48 -07004334 @Override public long getBluetoothControllerActivity(int type, int which) {
4335 if (type >= 0 && type < mBluetoothActivityCounters.length) {
4336 return mBluetoothActivityCounters[type].getCountLocked(which);
4337 }
4338 return 0;
4339 }
4340
Adam Lesinski17390762015-04-10 13:17:47 -07004341 @Override public boolean hasWifiActivityReporting() {
4342 return mHasWifiEnergyReporting;
4343 }
4344
Adam Lesinski33dac552015-03-09 15:24:48 -07004345 @Override public long getWifiControllerActivity(int type, int which) {
4346 if (type >= 0 && type < mWifiActivityCounters.length) {
4347 return mWifiActivityCounters[type].getCountLocked(which);
4348 }
4349 return 0;
4350 }
4351
Ruben Brunk5b1308f2015-06-03 18:49:27 -07004352 @Override
4353 public long getFlashlightOnTime(long elapsedRealtimeUs, int which) {
Dianne Hackbornabc7c492014-06-30 16:57:46 -07004354 return mFlashlightOnTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
4355 }
4356
Ruben Brunk5b1308f2015-06-03 18:49:27 -07004357 @Override
4358 public long getFlashlightOnCount(int which) {
Dianne Hackbornabc7c492014-06-30 16:57:46 -07004359 return mFlashlightOnTimer.getCountLocked(which);
4360 }
4361
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07004362 @Override
Ruben Brunk5b1308f2015-06-03 18:49:27 -07004363 public long getCameraOnTime(long elapsedRealtimeUs, int which) {
4364 return mCameraOnTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
4365 }
4366
4367 @Override
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08004368 public long getNetworkActivityBytes(int type, int which) {
4369 if (type >= 0 && type < mNetworkByteActivityCounters.length) {
4370 return mNetworkByteActivityCounters[type].getCountLocked(which);
4371 } else {
4372 return 0;
4373 }
4374 }
4375
4376 @Override
4377 public long getNetworkActivityPackets(int type, int which) {
4378 if (type >= 0 && type < mNetworkPacketActivityCounters.length) {
4379 return mNetworkPacketActivityCounters[type].getCountLocked(which);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07004380 } else {
4381 return 0;
4382 }
4383 }
4384
Dianne Hackborn5f4a5f92014-01-24 16:59:34 -08004385 @Override public long getStartClockTime() {
Dianne Hackbornd48954f2015-07-22 17:20:33 -07004386 final long currentTime = System.currentTimeMillis();
4387 if (ensureStartClockTime(currentTime)) {
4388 recordCurrentTimeChangeLocked(currentTime, SystemClock.elapsedRealtime(),
4389 SystemClock.uptimeMillis());
Dianne Hackborn7d9eefd2014-08-27 18:30:31 -07004390 }
Dianne Hackborn5f4a5f92014-01-24 16:59:34 -08004391 return mStartClockTime;
4392 }
4393
Dianne Hackborncd0e3352014-08-07 17:08:09 -07004394 @Override public String getStartPlatformVersion() {
4395 return mStartPlatformVersion;
4396 }
4397
4398 @Override public String getEndPlatformVersion() {
4399 return mEndPlatformVersion;
4400 }
4401
4402 @Override public int getParcelVersion() {
4403 return VERSION;
4404 }
4405
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004406 @Override public boolean getIsOnBattery() {
4407 return mOnBattery;
4408 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004409
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004410 @Override public SparseArray<? extends BatteryStats.Uid> getUidStats() {
4411 return mUidStats;
4412 }
4413
4414 /**
4415 * The statistics associated with a particular uid.
4416 */
4417 public final class Uid extends BatteryStats.Uid {
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004418
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004419 final int mUid;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004420
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07004421 boolean mWifiRunning;
4422 StopwatchTimer mWifiRunningTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004423
The Android Open Source Project10592532009-03-18 17:39:46 -07004424 boolean mFullWifiLockOut;
Evan Millarc64edde2009-04-18 12:26:32 -07004425 StopwatchTimer mFullWifiLockTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004426
Nick Pelly6ccaa542012-06-15 15:22:47 -07004427 boolean mWifiScanStarted;
4428 StopwatchTimer mWifiScanTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004429
Dianne Hackborn61659e52014-07-09 16:13:01 -07004430 static final int NO_BATCHED_SCAN_STARTED = -1;
Robert Greenwalta029ea12013-09-25 16:38:12 -07004431 int mWifiBatchedScanBinStarted = NO_BATCHED_SCAN_STARTED;
4432 StopwatchTimer[] mWifiBatchedScanTimer;
4433
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004434 boolean mWifiMulticastEnabled;
4435 StopwatchTimer mWifiMulticastTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004436
Amith Yamasani244fa5c2009-05-22 14:36:07 -07004437 StopwatchTimer mAudioTurnedOnTimer;
Amith Yamasani244fa5c2009-05-22 14:36:07 -07004438 StopwatchTimer mVideoTurnedOnTimer;
Ruben Brunk6d2c3632015-05-26 17:32:16 -07004439 StopwatchTimer mFlashlightTurnedOnTimer;
4440 StopwatchTimer mCameraTurnedOnTimer;
4441
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004442
Jeff Sharkey3e013e82013-04-25 14:48:19 -07004443 StopwatchTimer mForegroundActivityTimer;
4444
Dianne Hackborn61659e52014-07-09 16:13:01 -07004445 static final int PROCESS_STATE_NONE = NUM_PROCESS_STATE;
4446 int mProcessState = PROCESS_STATE_NONE;
4447 StopwatchTimer[] mProcessStateTimer;
4448
Dianne Hackborna06de0f2012-12-11 16:34:47 -08004449 BatchTimer mVibratorOnTimer;
4450
Dianne Hackborn617f8772009-03-31 15:04:46 -07004451 Counter[] mUserActivityCounters;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004452
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08004453 LongSamplingCounter[] mNetworkByteActivityCounters;
4454 LongSamplingCounter[] mNetworkPacketActivityCounters;
Dianne Hackbornd45665b2014-02-26 12:35:32 -08004455 LongSamplingCounter mMobileRadioActiveTime;
4456 LongSamplingCounter mMobileRadioActiveCount;
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07004457
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004458 /**
Adam Lesinskie08af192015-03-25 16:42:59 -07004459 * The amount of time this uid has kept the WiFi controller in idle, tx, and rx mode.
4460 */
4461 LongSamplingCounter[] mWifiControllerTime =
4462 new LongSamplingCounter[NUM_CONTROLLER_ACTIVITY_TYPES];
4463
4464 /**
4465 * The amount of time this uid has kept the Bluetooth controller in idle, tx, and rx mode.
4466 */
4467 LongSamplingCounter[] mBluetoothControllerTime =
4468 new LongSamplingCounter[NUM_CONTROLLER_ACTIVITY_TYPES];
4469
4470 /**
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08004471 * The CPU times we had at the last history details update.
4472 */
4473 long mLastStepUserTime;
4474 long mLastStepSystemTime;
4475 long mCurStepUserTime;
4476 long mCurStepSystemTime;
4477
Adam Lesinski06af1fa2015-05-05 17:35:35 -07004478 LongSamplingCounter mUserCpuTime = new LongSamplingCounter(mOnBatteryTimeBase);
4479 LongSamplingCounter mSystemCpuTime = new LongSamplingCounter(mOnBatteryTimeBase);
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07004480 LongSamplingCounter mCpuPower = new LongSamplingCounter(mOnBatteryTimeBase);
Adam Lesinski6832f392015-09-05 18:05:40 -07004481 LongSamplingCounter[][] mCpuClusterSpeed;
Adam Lesinski06af1fa2015-05-05 17:35:35 -07004482
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08004483 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004484 * The statistics we have collected for this uid's wake locks.
4485 */
Dianne Hackbornd953c532014-08-16 18:17:38 -07004486 final OverflowArrayMap<Wakelock> mWakelockStats = new OverflowArrayMap<Wakelock>() {
4487 @Override public Wakelock instantiateObject() { return new Wakelock(); }
4488 };
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004489
4490 /**
Dianne Hackbornfdb19562014-07-11 16:03:36 -07004491 * The statistics we have collected for this uid's syncs.
4492 */
Dianne Hackbornd953c532014-08-16 18:17:38 -07004493 final OverflowArrayMap<StopwatchTimer> mSyncStats = new OverflowArrayMap<StopwatchTimer>() {
4494 @Override public StopwatchTimer instantiateObject() {
4495 return new StopwatchTimer(Uid.this, SYNC, null, mOnBatteryTimeBase);
4496 }
4497 };
Dianne Hackbornfdb19562014-07-11 16:03:36 -07004498
4499 /**
4500 * The statistics we have collected for this uid's jobs.
4501 */
Dianne Hackbornd953c532014-08-16 18:17:38 -07004502 final OverflowArrayMap<StopwatchTimer> mJobStats = new OverflowArrayMap<StopwatchTimer>() {
4503 @Override public StopwatchTimer instantiateObject() {
4504 return new StopwatchTimer(Uid.this, JOB, null, mOnBatteryTimeBase);
4505 }
4506 };
Dianne Hackbornfdb19562014-07-11 16:03:36 -07004507
4508 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004509 * The statistics we have collected for this uid's sensor activations.
4510 */
Adam Lesinskie08af192015-03-25 16:42:59 -07004511 final SparseArray<Sensor> mSensorStats = new SparseArray<>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004512
4513 /**
4514 * The statistics we have collected for this uid's processes.
4515 */
Adam Lesinskie08af192015-03-25 16:42:59 -07004516 final ArrayMap<String, Proc> mProcessStats = new ArrayMap<>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004517
4518 /**
4519 * The statistics we have collected for this uid's processes.
4520 */
Adam Lesinskie08af192015-03-25 16:42:59 -07004521 final ArrayMap<String, Pkg> mPackageStats = new ArrayMap<>();
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004522
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07004523 /**
4524 * The transient wake stats we have collected for this uid's pids.
4525 */
Adam Lesinskie08af192015-03-25 16:42:59 -07004526 final SparseArray<Pid> mPids = new SparseArray<>();
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07004527
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004528 public Uid(int uid) {
4529 mUid = uid;
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07004530 mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004531 mWifiRunningTimers, mOnBatteryTimeBase);
Dianne Hackborn0d903a82010-09-07 23:51:03 -07004532 mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004533 mFullWifiLockTimers, mOnBatteryTimeBase);
Nick Pelly6ccaa542012-06-15 15:22:47 -07004534 mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004535 mWifiScanTimers, mOnBatteryTimeBase);
Robert Greenwalta029ea12013-09-25 16:38:12 -07004536 mWifiBatchedScanTimer = new StopwatchTimer[NUM_WIFI_BATCHED_SCAN_BINS];
Dianne Hackborn0d903a82010-09-07 23:51:03 -07004537 mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004538 mWifiMulticastTimers, mOnBatteryTimeBase);
Dianne Hackborn61659e52014-07-09 16:13:01 -07004539 mProcessStateTimer = new StopwatchTimer[NUM_PROCESS_STATE];
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004540 }
4541
4542 @Override
Dianne Hackborn1e725a72015-03-24 18:23:19 -07004543 public ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
Dianne Hackbornd953c532014-08-16 18:17:38 -07004544 return mWakelockStats.getMap();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004545 }
4546
4547 @Override
Dianne Hackborn1e725a72015-03-24 18:23:19 -07004548 public ArrayMap<String, ? extends BatteryStats.Timer> getSyncStats() {
Dianne Hackbornd953c532014-08-16 18:17:38 -07004549 return mSyncStats.getMap();
Dianne Hackbornfdb19562014-07-11 16:03:36 -07004550 }
4551
4552 @Override
Dianne Hackborn1e725a72015-03-24 18:23:19 -07004553 public ArrayMap<String, ? extends BatteryStats.Timer> getJobStats() {
Dianne Hackbornd953c532014-08-16 18:17:38 -07004554 return mJobStats.getMap();
Dianne Hackbornfdb19562014-07-11 16:03:36 -07004555 }
4556
4557 @Override
Dianne Hackborn61659e52014-07-09 16:13:01 -07004558 public SparseArray<? extends BatteryStats.Uid.Sensor> getSensorStats() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004559 return mSensorStats;
4560 }
4561
4562 @Override
Dianne Hackborn1e725a72015-03-24 18:23:19 -07004563 public ArrayMap<String, ? extends BatteryStats.Uid.Proc> getProcessStats() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004564 return mProcessStats;
4565 }
4566
4567 @Override
Dianne Hackborn1e725a72015-03-24 18:23:19 -07004568 public ArrayMap<String, ? extends BatteryStats.Uid.Pkg> getPackageStats() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004569 return mPackageStats;
4570 }
Amith Yamasanieaeb6632009-06-03 15:16:10 -07004571
4572 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004573 public int getUid() {
4574 return mUid;
4575 }
Amith Yamasanieaeb6632009-06-03 15:16:10 -07004576
4577 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004578 public void noteWifiRunningLocked(long elapsedRealtimeMs) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07004579 if (!mWifiRunning) {
4580 mWifiRunning = true;
4581 if (mWifiRunningTimer == null) {
4582 mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004583 mWifiRunningTimers, mOnBatteryTimeBase);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004584 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004585 mWifiRunningTimer.startRunningLocked(elapsedRealtimeMs);
Dianne Hackborn617f8772009-03-31 15:04:46 -07004586 }
4587 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004588
Dianne Hackborn617f8772009-03-31 15:04:46 -07004589 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004590 public void noteWifiStoppedLocked(long elapsedRealtimeMs) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07004591 if (mWifiRunning) {
4592 mWifiRunning = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004593 mWifiRunningTimer.stopRunningLocked(elapsedRealtimeMs);
Dianne Hackborn617f8772009-03-31 15:04:46 -07004594 }
4595 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004596
Dianne Hackborn617f8772009-03-31 15:04:46 -07004597 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004598 public void noteFullWifiLockAcquiredLocked(long elapsedRealtimeMs) {
The Android Open Source Project10592532009-03-18 17:39:46 -07004599 if (!mFullWifiLockOut) {
4600 mFullWifiLockOut = true;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004601 if (mFullWifiLockTimer == null) {
Dianne Hackborn0d903a82010-09-07 23:51:03 -07004602 mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004603 mFullWifiLockTimers, mOnBatteryTimeBase);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004604 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004605 mFullWifiLockTimer.startRunningLocked(elapsedRealtimeMs);
The Android Open Source Project10592532009-03-18 17:39:46 -07004606 }
4607 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004608
The Android Open Source Project10592532009-03-18 17:39:46 -07004609 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004610 public void noteFullWifiLockReleasedLocked(long elapsedRealtimeMs) {
The Android Open Source Project10592532009-03-18 17:39:46 -07004611 if (mFullWifiLockOut) {
4612 mFullWifiLockOut = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004613 mFullWifiLockTimer.stopRunningLocked(elapsedRealtimeMs);
The Android Open Source Project10592532009-03-18 17:39:46 -07004614 }
4615 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004616
The Android Open Source Project10592532009-03-18 17:39:46 -07004617 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004618 public void noteWifiScanStartedLocked(long elapsedRealtimeMs) {
Nick Pelly6ccaa542012-06-15 15:22:47 -07004619 if (!mWifiScanStarted) {
4620 mWifiScanStarted = true;
4621 if (mWifiScanTimer == null) {
4622 mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004623 mWifiScanTimers, mOnBatteryTimeBase);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004624 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004625 mWifiScanTimer.startRunningLocked(elapsedRealtimeMs);
The Android Open Source Project10592532009-03-18 17:39:46 -07004626 }
4627 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004628
The Android Open Source Project10592532009-03-18 17:39:46 -07004629 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004630 public void noteWifiScanStoppedLocked(long elapsedRealtimeMs) {
Nick Pelly6ccaa542012-06-15 15:22:47 -07004631 if (mWifiScanStarted) {
4632 mWifiScanStarted = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004633 mWifiScanTimer.stopRunningLocked(elapsedRealtimeMs);
The Android Open Source Project10592532009-03-18 17:39:46 -07004634 }
4635 }
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004636
4637 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004638 public void noteWifiBatchedScanStartedLocked(int csph, long elapsedRealtimeMs) {
Robert Greenwalta029ea12013-09-25 16:38:12 -07004639 int bin = 0;
Navtej Singh Mann3c0ce5c2015-06-11 16:53:11 -07004640 while (csph > 8 && bin < NUM_WIFI_BATCHED_SCAN_BINS-1) {
Robert Greenwalta029ea12013-09-25 16:38:12 -07004641 csph = csph >> 3;
4642 bin++;
4643 }
4644
4645 if (mWifiBatchedScanBinStarted == bin) return;
4646
4647 if (mWifiBatchedScanBinStarted != NO_BATCHED_SCAN_STARTED) {
4648 mWifiBatchedScanTimer[mWifiBatchedScanBinStarted].
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004649 stopRunningLocked(elapsedRealtimeMs);
Robert Greenwalta029ea12013-09-25 16:38:12 -07004650 }
4651 mWifiBatchedScanBinStarted = bin;
4652 if (mWifiBatchedScanTimer[bin] == null) {
4653 makeWifiBatchedScanBin(bin, null);
4654 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004655 mWifiBatchedScanTimer[bin].startRunningLocked(elapsedRealtimeMs);
Robert Greenwalta029ea12013-09-25 16:38:12 -07004656 }
4657
4658 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004659 public void noteWifiBatchedScanStoppedLocked(long elapsedRealtimeMs) {
Robert Greenwalta029ea12013-09-25 16:38:12 -07004660 if (mWifiBatchedScanBinStarted != NO_BATCHED_SCAN_STARTED) {
4661 mWifiBatchedScanTimer[mWifiBatchedScanBinStarted].
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004662 stopRunningLocked(elapsedRealtimeMs);
Robert Greenwalta029ea12013-09-25 16:38:12 -07004663 mWifiBatchedScanBinStarted = NO_BATCHED_SCAN_STARTED;
4664 }
4665 }
4666
4667 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004668 public void noteWifiMulticastEnabledLocked(long elapsedRealtimeMs) {
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004669 if (!mWifiMulticastEnabled) {
4670 mWifiMulticastEnabled = true;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004671 if (mWifiMulticastTimer == null) {
Dianne Hackborn0d903a82010-09-07 23:51:03 -07004672 mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004673 mWifiMulticastTimers, mOnBatteryTimeBase);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004674 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004675 mWifiMulticastTimer.startRunningLocked(elapsedRealtimeMs);
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004676 }
4677 }
4678
4679 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004680 public void noteWifiMulticastDisabledLocked(long elapsedRealtimeMs) {
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004681 if (mWifiMulticastEnabled) {
4682 mWifiMulticastEnabled = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004683 mWifiMulticastTimer.stopRunningLocked(elapsedRealtimeMs);
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004684 }
4685 }
4686
Adam Lesinskie08af192015-03-25 16:42:59 -07004687 public void noteWifiControllerActivityLocked(int type, long timeMs) {
4688 if (mWifiControllerTime[type] == null) {
4689 mWifiControllerTime[type] = new LongSamplingCounter(mOnBatteryTimeBase);
4690 }
4691 mWifiControllerTime[type].addCountLocked(timeMs);
4692 }
4693
Dianne Hackborna06de0f2012-12-11 16:34:47 -08004694 public StopwatchTimer createAudioTurnedOnTimerLocked() {
4695 if (mAudioTurnedOnTimer == null) {
4696 mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
Dianne Hackborn10eaa852014-07-22 22:54:55 -07004697 mAudioTurnedOnTimers, mOnBatteryTimeBase);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08004698 }
4699 return mAudioTurnedOnTimer;
4700 }
4701
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004702 public void noteAudioTurnedOnLocked(long elapsedRealtimeMs) {
Dianne Hackborn10eaa852014-07-22 22:54:55 -07004703 createAudioTurnedOnTimerLocked().startRunningLocked(elapsedRealtimeMs);
4704 }
4705
4706 public void noteAudioTurnedOffLocked(long elapsedRealtimeMs) {
4707 if (mAudioTurnedOnTimer != null) {
4708 mAudioTurnedOnTimer.stopRunningLocked(elapsedRealtimeMs);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004709 }
4710 }
4711
Dianne Hackborn10eaa852014-07-22 22:54:55 -07004712 public void noteResetAudioLocked(long elapsedRealtimeMs) {
4713 if (mAudioTurnedOnTimer != null) {
4714 mAudioTurnedOnTimer.stopAllRunningLocked(elapsedRealtimeMs);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004715 }
4716 }
4717
Dianne Hackborna06de0f2012-12-11 16:34:47 -08004718 public StopwatchTimer createVideoTurnedOnTimerLocked() {
4719 if (mVideoTurnedOnTimer == null) {
4720 mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
Dianne Hackborn10eaa852014-07-22 22:54:55 -07004721 mVideoTurnedOnTimers, mOnBatteryTimeBase);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08004722 }
4723 return mVideoTurnedOnTimer;
4724 }
4725
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004726 public void noteVideoTurnedOnLocked(long elapsedRealtimeMs) {
Dianne Hackborn10eaa852014-07-22 22:54:55 -07004727 createVideoTurnedOnTimerLocked().startRunningLocked(elapsedRealtimeMs);
4728 }
4729
4730 public void noteVideoTurnedOffLocked(long elapsedRealtimeMs) {
4731 if (mVideoTurnedOnTimer != null) {
4732 mVideoTurnedOnTimer.stopRunningLocked(elapsedRealtimeMs);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004733 }
4734 }
4735
Dianne Hackborn10eaa852014-07-22 22:54:55 -07004736 public void noteResetVideoLocked(long elapsedRealtimeMs) {
4737 if (mVideoTurnedOnTimer != null) {
4738 mVideoTurnedOnTimer.stopAllRunningLocked(elapsedRealtimeMs);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08004739 }
4740 }
4741
Ruben Brunk6d2c3632015-05-26 17:32:16 -07004742 public StopwatchTimer createFlashlightTurnedOnTimerLocked() {
4743 if (mFlashlightTurnedOnTimer == null) {
4744 mFlashlightTurnedOnTimer = new StopwatchTimer(Uid.this, FLASHLIGHT_TURNED_ON,
4745 mFlashlightTurnedOnTimers, mOnBatteryTimeBase);
4746 }
4747 return mFlashlightTurnedOnTimer;
4748 }
4749
4750 public void noteFlashlightTurnedOnLocked(long elapsedRealtimeMs) {
4751 createFlashlightTurnedOnTimerLocked().startRunningLocked(elapsedRealtimeMs);
4752 }
4753
4754 public void noteFlashlightTurnedOffLocked(long elapsedRealtimeMs) {
4755 if (mFlashlightTurnedOnTimer != null) {
4756 mFlashlightTurnedOnTimer.stopRunningLocked(elapsedRealtimeMs);
4757 }
4758 }
4759
4760 public void noteResetFlashlightLocked(long elapsedRealtimeMs) {
4761 if (mFlashlightTurnedOnTimer != null) {
4762 mFlashlightTurnedOnTimer.stopAllRunningLocked(elapsedRealtimeMs);
4763 }
4764 }
4765
4766 public StopwatchTimer createCameraTurnedOnTimerLocked() {
4767 if (mCameraTurnedOnTimer == null) {
4768 mCameraTurnedOnTimer = new StopwatchTimer(Uid.this, CAMERA_TURNED_ON,
4769 mCameraTurnedOnTimers, mOnBatteryTimeBase);
4770 }
4771 return mCameraTurnedOnTimer;
4772 }
4773
4774 public void noteCameraTurnedOnLocked(long elapsedRealtimeMs) {
4775 createCameraTurnedOnTimerLocked().startRunningLocked(elapsedRealtimeMs);
4776 }
4777
4778 public void noteCameraTurnedOffLocked(long elapsedRealtimeMs) {
4779 if (mCameraTurnedOnTimer != null) {
4780 mCameraTurnedOnTimer.stopRunningLocked(elapsedRealtimeMs);
4781 }
4782 }
4783
4784 public void noteResetCameraLocked(long elapsedRealtimeMs) {
4785 if (mCameraTurnedOnTimer != null) {
4786 mCameraTurnedOnTimer.stopAllRunningLocked(elapsedRealtimeMs);
4787 }
4788 }
4789
Jeff Sharkey3e013e82013-04-25 14:48:19 -07004790 public StopwatchTimer createForegroundActivityTimerLocked() {
4791 if (mForegroundActivityTimer == null) {
4792 mForegroundActivityTimer = new StopwatchTimer(
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004793 Uid.this, FOREGROUND_ACTIVITY, null, mOnBatteryTimeBase);
Jeff Sharkey3e013e82013-04-25 14:48:19 -07004794 }
4795 return mForegroundActivityTimer;
4796 }
4797
4798 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004799 public void noteActivityResumedLocked(long elapsedRealtimeMs) {
Jeff Sharkey3e013e82013-04-25 14:48:19 -07004800 // We always start, since we want multiple foreground PIDs to nest
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004801 createForegroundActivityTimerLocked().startRunningLocked(elapsedRealtimeMs);
Jeff Sharkey3e013e82013-04-25 14:48:19 -07004802 }
4803
4804 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004805 public void noteActivityPausedLocked(long elapsedRealtimeMs) {
Jeff Sharkey3e013e82013-04-25 14:48:19 -07004806 if (mForegroundActivityTimer != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004807 mForegroundActivityTimer.stopRunningLocked(elapsedRealtimeMs);
Jeff Sharkey3e013e82013-04-25 14:48:19 -07004808 }
4809 }
4810
Dianne Hackborn61659e52014-07-09 16:13:01 -07004811 void updateUidProcessStateLocked(int state, long elapsedRealtimeMs) {
4812 if (mProcessState == state) return;
4813
4814 if (mProcessState != PROCESS_STATE_NONE) {
4815 mProcessStateTimer[mProcessState].stopRunningLocked(elapsedRealtimeMs);
4816 }
4817 mProcessState = state;
4818 if (state != PROCESS_STATE_NONE) {
4819 if (mProcessStateTimer[state] == null) {
4820 makeProcessState(state, null);
4821 }
4822 mProcessStateTimer[state].startRunningLocked(elapsedRealtimeMs);
4823 }
4824 }
4825
Dianne Hackborna06de0f2012-12-11 16:34:47 -08004826 public BatchTimer createVibratorOnTimerLocked() {
4827 if (mVibratorOnTimer == null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004828 mVibratorOnTimer = new BatchTimer(Uid.this, VIBRATOR_ON, mOnBatteryTimeBase);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08004829 }
4830 return mVibratorOnTimer;
4831 }
4832
4833 public void noteVibratorOnLocked(long durationMillis) {
4834 createVibratorOnTimerLocked().addDuration(BatteryStatsImpl.this, durationMillis);
4835 }
4836
4837 public void noteVibratorOffLocked() {
4838 if (mVibratorOnTimer != null) {
4839 mVibratorOnTimer.abortLastDuration(BatteryStatsImpl.this);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004840 }
4841 }
4842
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004843 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004844 public long getWifiRunningTime(long elapsedRealtimeUs, int which) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07004845 if (mWifiRunningTimer == null) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004846 return 0;
4847 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004848 return mWifiRunningTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
Dianne Hackborn617f8772009-03-31 15:04:46 -07004849 }
Amith Yamasani244fa5c2009-05-22 14:36:07 -07004850
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004851 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004852 public long getFullWifiLockTime(long elapsedRealtimeUs, int which) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004853 if (mFullWifiLockTimer == null) {
4854 return 0;
4855 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004856 return mFullWifiLockTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
The Android Open Source Project10592532009-03-18 17:39:46 -07004857 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004858
4859 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004860 public long getWifiScanTime(long elapsedRealtimeUs, int which) {
Nick Pelly6ccaa542012-06-15 15:22:47 -07004861 if (mWifiScanTimer == null) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004862 return 0;
4863 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004864 return mWifiScanTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
The Android Open Source Project10592532009-03-18 17:39:46 -07004865 }
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004866
4867 @Override
Dianne Hackborn62793e42015-03-09 11:15:41 -07004868 public int getWifiScanCount(int which) {
4869 if (mWifiScanTimer == null) {
4870 return 0;
4871 }
4872 return mWifiScanTimer.getCountLocked(which);
4873 }
4874
4875 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004876 public long getWifiBatchedScanTime(int csphBin, long elapsedRealtimeUs, int which) {
Robert Greenwalta029ea12013-09-25 16:38:12 -07004877 if (csphBin < 0 || csphBin >= NUM_WIFI_BATCHED_SCAN_BINS) return 0;
4878 if (mWifiBatchedScanTimer[csphBin] == null) {
4879 return 0;
4880 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004881 return mWifiBatchedScanTimer[csphBin].getTotalTimeLocked(elapsedRealtimeUs, which);
Robert Greenwalta029ea12013-09-25 16:38:12 -07004882 }
4883
4884 @Override
Dianne Hackborn62793e42015-03-09 11:15:41 -07004885 public int getWifiBatchedScanCount(int csphBin, int which) {
4886 if (csphBin < 0 || csphBin >= NUM_WIFI_BATCHED_SCAN_BINS) return 0;
4887 if (mWifiBatchedScanTimer[csphBin] == null) {
4888 return 0;
4889 }
4890 return mWifiBatchedScanTimer[csphBin].getCountLocked(which);
4891 }
4892
4893 @Override
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004894 public long getWifiMulticastTime(long elapsedRealtimeUs, int which) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004895 if (mWifiMulticastTimer == null) {
4896 return 0;
4897 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004898 return mWifiMulticastTimer.getTotalTimeLocked(elapsedRealtimeUs, which);
Robert Greenwalt5347bd42009-05-13 15:10:16 -07004899 }
4900
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004901 @Override
Ruben Brunk6d2c3632015-05-26 17:32:16 -07004902 public Timer getAudioTurnedOnTimer() {
4903 return mAudioTurnedOnTimer;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004904 }
4905
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004906 @Override
Ruben Brunk6d2c3632015-05-26 17:32:16 -07004907 public Timer getVideoTurnedOnTimer() {
4908 return mVideoTurnedOnTimer;
4909 }
4910
4911 @Override
4912 public Timer getFlashlightTurnedOnTimer() {
4913 return mFlashlightTurnedOnTimer;
4914 }
4915
4916 @Override
4917 public Timer getCameraTurnedOnTimer() {
4918 return mCameraTurnedOnTimer;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07004919 }
4920
Dianne Hackborn617f8772009-03-31 15:04:46 -07004921 @Override
Jeff Sharkey3e013e82013-04-25 14:48:19 -07004922 public Timer getForegroundActivityTimer() {
4923 return mForegroundActivityTimer;
4924 }
4925
Dianne Hackborn61659e52014-07-09 16:13:01 -07004926 void makeProcessState(int i, Parcel in) {
4927 if (i < 0 || i >= NUM_PROCESS_STATE) return;
4928
4929 if (in == null) {
4930 mProcessStateTimer[i] = new StopwatchTimer(this, PROCESS_STATE, null,
4931 mOnBatteryTimeBase);
4932 } else {
4933 mProcessStateTimer[i] = new StopwatchTimer(this, PROCESS_STATE, null,
4934 mOnBatteryTimeBase, in);
4935 }
4936 }
4937
4938 @Override
4939 public long getProcessStateTime(int state, long elapsedRealtimeUs, int which) {
4940 if (state < 0 || state >= NUM_PROCESS_STATE) return 0;
4941 if (mProcessStateTimer[state] == null) {
4942 return 0;
4943 }
4944 return mProcessStateTimer[state].getTotalTimeLocked(elapsedRealtimeUs, which);
4945 }
4946
Jeff Sharkey3e013e82013-04-25 14:48:19 -07004947 @Override
Dianne Hackborna06de0f2012-12-11 16:34:47 -08004948 public Timer getVibratorOnTimer() {
4949 return mVibratorOnTimer;
4950 }
4951
4952 @Override
Dianne Hackborn617f8772009-03-31 15:04:46 -07004953 public void noteUserActivityLocked(int type) {
4954 if (mUserActivityCounters == null) {
4955 initUserActivityLocked();
4956 }
Jeff Browndf693de2012-07-27 12:03:38 -07004957 if (type >= 0 && type < NUM_USER_ACTIVITY_TYPES) {
4958 mUserActivityCounters[type].stepAtomic();
4959 } else {
4960 Slog.w(TAG, "Unknown user activity type " + type + " was specified.",
4961 new Throwable());
4962 }
Dianne Hackborn617f8772009-03-31 15:04:46 -07004963 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004964
Dianne Hackborn617f8772009-03-31 15:04:46 -07004965 @Override
4966 public boolean hasUserActivity() {
4967 return mUserActivityCounters != null;
4968 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004969
Dianne Hackborn617f8772009-03-31 15:04:46 -07004970 @Override
4971 public int getUserActivityCount(int type, int which) {
4972 if (mUserActivityCounters == null) {
4973 return 0;
4974 }
Evan Millarc64edde2009-04-18 12:26:32 -07004975 return mUserActivityCounters[type].getCountLocked(which);
Dianne Hackborn617f8772009-03-31 15:04:46 -07004976 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07004977
Robert Greenwalta029ea12013-09-25 16:38:12 -07004978 void makeWifiBatchedScanBin(int i, Parcel in) {
4979 if (i < 0 || i >= NUM_WIFI_BATCHED_SCAN_BINS) return;
4980
4981 ArrayList<StopwatchTimer> collected = mWifiBatchedScanTimers.get(i);
4982 if (collected == null) {
4983 collected = new ArrayList<StopwatchTimer>();
4984 mWifiBatchedScanTimers.put(i, collected);
4985 }
4986 if (in == null) {
4987 mWifiBatchedScanTimer[i] = new StopwatchTimer(this, WIFI_BATCHED_SCAN, collected,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004988 mOnBatteryTimeBase);
Robert Greenwalta029ea12013-09-25 16:38:12 -07004989 } else {
4990 mWifiBatchedScanTimer[i] = new StopwatchTimer(this, WIFI_BATCHED_SCAN, collected,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004991 mOnBatteryTimeBase, in);
Robert Greenwalta029ea12013-09-25 16:38:12 -07004992 }
4993 }
4994
4995
Dianne Hackborn617f8772009-03-31 15:04:46 -07004996 void initUserActivityLocked() {
4997 mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
4998 for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08004999 mUserActivityCounters[i] = new Counter(mOnBatteryTimeBase);
Dianne Hackborn617f8772009-03-31 15:04:46 -07005000 }
5001 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005002
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005003 void noteNetworkActivityLocked(int type, long deltaBytes, long deltaPackets) {
5004 if (mNetworkByteActivityCounters == null) {
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005005 initNetworkActivityLocked();
5006 }
5007 if (type >= 0 && type < NUM_NETWORK_ACTIVITY_TYPES) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005008 mNetworkByteActivityCounters[type].addCountLocked(deltaBytes);
5009 mNetworkPacketActivityCounters[type].addCountLocked(deltaPackets);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005010 } else {
5011 Slog.w(TAG, "Unknown network activity type " + type + " was specified.",
5012 new Throwable());
5013 }
5014 }
5015
Dianne Hackbornd45665b2014-02-26 12:35:32 -08005016 void noteMobileRadioActiveTimeLocked(long batteryUptime) {
5017 if (mNetworkByteActivityCounters == null) {
5018 initNetworkActivityLocked();
5019 }
5020 mMobileRadioActiveTime.addCountLocked(batteryUptime);
5021 mMobileRadioActiveCount.addCountLocked(1);
5022 }
5023
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005024 @Override
5025 public boolean hasNetworkActivity() {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005026 return mNetworkByteActivityCounters != null;
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005027 }
5028
5029 @Override
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005030 public long getNetworkActivityBytes(int type, int which) {
5031 if (mNetworkByteActivityCounters != null && type >= 0
5032 && type < mNetworkByteActivityCounters.length) {
5033 return mNetworkByteActivityCounters[type].getCountLocked(which);
5034 } else {
5035 return 0;
5036 }
5037 }
5038
5039 @Override
5040 public long getNetworkActivityPackets(int type, int which) {
5041 if (mNetworkPacketActivityCounters != null && type >= 0
5042 && type < mNetworkPacketActivityCounters.length) {
5043 return mNetworkPacketActivityCounters[type].getCountLocked(which);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005044 } else {
5045 return 0;
5046 }
5047 }
5048
Dianne Hackbornd45665b2014-02-26 12:35:32 -08005049 @Override
5050 public long getMobileRadioActiveTime(int which) {
5051 return mMobileRadioActiveTime != null
5052 ? mMobileRadioActiveTime.getCountLocked(which) : 0;
5053 }
5054
5055 @Override
5056 public int getMobileRadioActiveCount(int which) {
5057 return mMobileRadioActiveCount != null
5058 ? (int)mMobileRadioActiveCount.getCountLocked(which) : 0;
5059 }
5060
Adam Lesinskie08af192015-03-25 16:42:59 -07005061 @Override
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005062 public long getUserCpuTimeUs(int which) {
5063 return mUserCpuTime.getCountLocked(which);
5064 }
5065
5066 @Override
5067 public long getSystemCpuTimeUs(int which) {
5068 return mSystemCpuTime.getCountLocked(which);
5069 }
5070
5071 @Override
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07005072 public long getCpuPowerMaUs(int which) {
5073 return mCpuPower.getCountLocked(which);
5074 }
5075
5076 @Override
Adam Lesinski6832f392015-09-05 18:05:40 -07005077 public long getTimeAtCpuSpeed(int cluster, int step, int which) {
5078 if (mCpuClusterSpeed != null) {
5079 if (cluster >= 0 && cluster < mCpuClusterSpeed.length) {
5080 final LongSamplingCounter[] cpuSpeeds = mCpuClusterSpeed[cluster];
5081 if (cpuSpeeds != null) {
5082 if (step >= 0 && step < cpuSpeeds.length) {
5083 final LongSamplingCounter c = cpuSpeeds[step];
5084 if (c != null) {
5085 return c.getCountLocked(which);
5086 }
5087 }
5088 }
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005089 }
5090 }
5091 return 0;
5092 }
5093
5094 @Override
Adam Lesinskie08af192015-03-25 16:42:59 -07005095 public long getWifiControllerActivity(int type, int which) {
5096 if (type >= 0 && type < NUM_CONTROLLER_ACTIVITY_TYPES &&
5097 mWifiControllerTime[type] != null) {
5098 return mWifiControllerTime[type].getCountLocked(which);
5099 }
5100 return 0;
5101 }
5102
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005103 void initNetworkActivityLocked() {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005104 mNetworkByteActivityCounters = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES];
5105 mNetworkPacketActivityCounters = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES];
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005106 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005107 mNetworkByteActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase);
5108 mNetworkPacketActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005109 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005110 mMobileRadioActiveTime = new LongSamplingCounter(mOnBatteryTimeBase);
5111 mMobileRadioActiveCount = new LongSamplingCounter(mOnBatteryTimeBase);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005112 }
Amith Yamasani244fa5c2009-05-22 14:36:07 -07005113
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005114 /**
5115 * Clear all stats for this uid. Returns true if the uid is completely
5116 * inactive so can be dropped.
5117 */
5118 boolean reset() {
5119 boolean active = false;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005120
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07005121 if (mWifiRunningTimer != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005122 active |= !mWifiRunningTimer.reset(false);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07005123 active |= mWifiRunning;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005124 }
5125 if (mFullWifiLockTimer != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005126 active |= !mFullWifiLockTimer.reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005127 active |= mFullWifiLockOut;
5128 }
Nick Pelly6ccaa542012-06-15 15:22:47 -07005129 if (mWifiScanTimer != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005130 active |= !mWifiScanTimer.reset(false);
Nick Pelly6ccaa542012-06-15 15:22:47 -07005131 active |= mWifiScanStarted;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005132 }
Robert Greenwalta029ea12013-09-25 16:38:12 -07005133 if (mWifiBatchedScanTimer != null) {
5134 for (int i = 0; i < NUM_WIFI_BATCHED_SCAN_BINS; i++) {
5135 if (mWifiBatchedScanTimer[i] != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005136 active |= !mWifiBatchedScanTimer[i].reset(false);
Robert Greenwalta029ea12013-09-25 16:38:12 -07005137 }
5138 }
5139 active |= (mWifiBatchedScanBinStarted != NO_BATCHED_SCAN_STARTED);
5140 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005141 if (mWifiMulticastTimer != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005142 active |= !mWifiMulticastTimer.reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005143 active |= mWifiMulticastEnabled;
5144 }
5145 if (mAudioTurnedOnTimer != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005146 active |= !mAudioTurnedOnTimer.reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005147 }
5148 if (mVideoTurnedOnTimer != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005149 active |= !mVideoTurnedOnTimer.reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005150 }
Ruben Brunk6d2c3632015-05-26 17:32:16 -07005151 if (mFlashlightTurnedOnTimer != null) {
5152 active |= !mFlashlightTurnedOnTimer.reset(false);
5153 }
5154 if (mCameraTurnedOnTimer != null) {
5155 active |= !mCameraTurnedOnTimer.reset(false);
5156 }
Jeff Sharkey3e013e82013-04-25 14:48:19 -07005157 if (mForegroundActivityTimer != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005158 active |= !mForegroundActivityTimer.reset(false);
Jeff Sharkey3e013e82013-04-25 14:48:19 -07005159 }
Dianne Hackborn61659e52014-07-09 16:13:01 -07005160 if (mProcessStateTimer != null) {
5161 for (int i = 0; i < NUM_PROCESS_STATE; i++) {
5162 if (mProcessStateTimer[i] != null) {
5163 active |= !mProcessStateTimer[i].reset(false);
5164 }
5165 }
5166 active |= (mProcessState != PROCESS_STATE_NONE);
5167 }
Dianne Hackborna06de0f2012-12-11 16:34:47 -08005168 if (mVibratorOnTimer != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005169 if (mVibratorOnTimer.reset(false)) {
Dianne Hackborna06de0f2012-12-11 16:34:47 -08005170 mVibratorOnTimer.detach();
5171 mVibratorOnTimer = null;
5172 } else {
5173 active = true;
5174 }
5175 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005176
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005177 if (mUserActivityCounters != null) {
5178 for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
5179 mUserActivityCounters[i].reset(false);
5180 }
5181 }
5182
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005183 if (mNetworkByteActivityCounters != null) {
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005184 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005185 mNetworkByteActivityCounters[i].reset(false);
5186 mNetworkPacketActivityCounters[i].reset(false);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005187 }
Dianne Hackbornd45665b2014-02-26 12:35:32 -08005188 mMobileRadioActiveTime.reset(false);
5189 mMobileRadioActiveCount.reset(false);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005190 }
5191
Adam Lesinskie08af192015-03-25 16:42:59 -07005192 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
5193 if (mWifiControllerTime[i] != null) {
5194 mWifiControllerTime[i].reset(false);
5195 }
5196
5197 if (mBluetoothControllerTime[i] != null) {
5198 mBluetoothControllerTime[i].reset(false);
5199 }
5200 }
5201
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005202 mUserCpuTime.reset(false);
5203 mSystemCpuTime.reset(false);
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07005204 mCpuPower.reset(false);
Adam Lesinski6832f392015-09-05 18:05:40 -07005205
5206 if (mCpuClusterSpeed != null) {
5207 for (LongSamplingCounter[] speeds : mCpuClusterSpeed) {
5208 if (speeds != null) {
5209 for (LongSamplingCounter speed : speeds) {
5210 if (speed != null) {
5211 speed.reset(false);
5212 }
5213 }
5214 }
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005215 }
5216 }
5217
Dianne Hackbornd953c532014-08-16 18:17:38 -07005218 final ArrayMap<String, Wakelock> wakeStats = mWakelockStats.getMap();
5219 for (int iw=wakeStats.size()-1; iw>=0; iw--) {
5220 Wakelock wl = wakeStats.valueAt(iw);
Dianne Hackborn61659e52014-07-09 16:13:01 -07005221 if (wl.reset()) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07005222 wakeStats.removeAt(iw);
Dianne Hackborn61659e52014-07-09 16:13:01 -07005223 } else {
5224 active = true;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005225 }
5226 }
Dianne Hackbornd953c532014-08-16 18:17:38 -07005227 mWakelockStats.cleanup();
5228 final ArrayMap<String, StopwatchTimer> syncStats = mSyncStats.getMap();
5229 for (int is=syncStats.size()-1; is>=0; is--) {
5230 StopwatchTimer timer = syncStats.valueAt(is);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005231 if (timer.reset(false)) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07005232 syncStats.removeAt(is);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005233 timer.detach();
5234 } else {
5235 active = true;
5236 }
5237 }
Dianne Hackbornd953c532014-08-16 18:17:38 -07005238 mSyncStats.cleanup();
5239 final ArrayMap<String, StopwatchTimer> jobStats = mJobStats.getMap();
5240 for (int ij=jobStats.size()-1; ij>=0; ij--) {
5241 StopwatchTimer timer = jobStats.valueAt(ij);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005242 if (timer.reset(false)) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07005243 jobStats.removeAt(ij);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005244 timer.detach();
5245 } else {
5246 active = true;
5247 }
5248 }
Dianne Hackbornd953c532014-08-16 18:17:38 -07005249 mJobStats.cleanup();
Dianne Hackborn61659e52014-07-09 16:13:01 -07005250 for (int ise=mSensorStats.size()-1; ise>=0; ise--) {
5251 Sensor s = mSensorStats.valueAt(ise);
5252 if (s.reset()) {
5253 mSensorStats.removeAt(ise);
5254 } else {
5255 active = true;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005256 }
5257 }
Dianne Hackborn61659e52014-07-09 16:13:01 -07005258 for (int ip=mProcessStats.size()-1; ip>=0; ip--) {
5259 Proc proc = mProcessStats.valueAt(ip);
5260 if (proc.mProcessState == PROCESS_STATE_NONE) {
5261 proc.detach();
5262 mProcessStats.removeAt(ip);
5263 } else {
Dianne Hackborncd0e3352014-08-07 17:08:09 -07005264 proc.reset();
Dianne Hackborn61659e52014-07-09 16:13:01 -07005265 active = true;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005266 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005267 }
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07005268 if (mPids.size() > 0) {
Dianne Hackborne5167ca2014-03-08 14:39:10 -08005269 for (int i=mPids.size()-1; i>=0; i--) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07005270 Pid pid = mPids.valueAt(i);
Dianne Hackborne5167ca2014-03-08 14:39:10 -08005271 if (pid.mWakeNesting > 0) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07005272 active = true;
Dianne Hackborne5167ca2014-03-08 14:39:10 -08005273 } else {
5274 mPids.removeAt(i);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07005275 }
5276 }
5277 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005278 if (mPackageStats.size() > 0) {
5279 Iterator<Map.Entry<String, Pkg>> it = mPackageStats.entrySet().iterator();
5280 while (it.hasNext()) {
5281 Map.Entry<String, Pkg> pkgEntry = it.next();
5282 Pkg p = pkgEntry.getValue();
5283 p.detach();
5284 if (p.mServiceStats.size() > 0) {
5285 Iterator<Map.Entry<String, Pkg.Serv>> it2
5286 = p.mServiceStats.entrySet().iterator();
5287 while (it2.hasNext()) {
5288 Map.Entry<String, Pkg.Serv> servEntry = it2.next();
5289 servEntry.getValue().detach();
5290 }
5291 }
5292 }
5293 mPackageStats.clear();
5294 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005295
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08005296 mLastStepUserTime = mLastStepSystemTime = 0;
5297 mCurStepUserTime = mCurStepSystemTime = 0;
5298
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005299 if (!active) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07005300 if (mWifiRunningTimer != null) {
5301 mWifiRunningTimer.detach();
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005302 }
5303 if (mFullWifiLockTimer != null) {
5304 mFullWifiLockTimer.detach();
5305 }
Nick Pelly6ccaa542012-06-15 15:22:47 -07005306 if (mWifiScanTimer != null) {
5307 mWifiScanTimer.detach();
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005308 }
Robert Greenwalta029ea12013-09-25 16:38:12 -07005309 for (int i = 0; i < NUM_WIFI_BATCHED_SCAN_BINS; i++) {
5310 if (mWifiBatchedScanTimer[i] != null) {
5311 mWifiBatchedScanTimer[i].detach();
5312 }
5313 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005314 if (mWifiMulticastTimer != null) {
5315 mWifiMulticastTimer.detach();
5316 }
5317 if (mAudioTurnedOnTimer != null) {
5318 mAudioTurnedOnTimer.detach();
Dianne Hackborna06de0f2012-12-11 16:34:47 -08005319 mAudioTurnedOnTimer = null;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005320 }
5321 if (mVideoTurnedOnTimer != null) {
5322 mVideoTurnedOnTimer.detach();
Dianne Hackborna06de0f2012-12-11 16:34:47 -08005323 mVideoTurnedOnTimer = null;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005324 }
Ruben Brunk6d2c3632015-05-26 17:32:16 -07005325 if (mFlashlightTurnedOnTimer != null) {
5326 mFlashlightTurnedOnTimer.detach();
5327 mFlashlightTurnedOnTimer = null;
5328 }
5329 if (mCameraTurnedOnTimer != null) {
5330 mCameraTurnedOnTimer.detach();
5331 mCameraTurnedOnTimer = null;
5332 }
Jeff Sharkey3e013e82013-04-25 14:48:19 -07005333 if (mForegroundActivityTimer != null) {
5334 mForegroundActivityTimer.detach();
5335 mForegroundActivityTimer = null;
5336 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005337 if (mUserActivityCounters != null) {
5338 for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
5339 mUserActivityCounters[i].detach();
5340 }
5341 }
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005342 if (mNetworkByteActivityCounters != null) {
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005343 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005344 mNetworkByteActivityCounters[i].detach();
5345 mNetworkPacketActivityCounters[i].detach();
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005346 }
5347 }
Adam Lesinskie08af192015-03-25 16:42:59 -07005348
5349 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
5350 if (mWifiControllerTime[i] != null) {
5351 mWifiControllerTime[i].detach();
5352 }
5353
5354 if (mBluetoothControllerTime[i] != null) {
5355 mBluetoothControllerTime[i].detach();
5356 }
5357 }
Dianne Hackborne5167ca2014-03-08 14:39:10 -08005358 mPids.clear();
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005359
5360 mUserCpuTime.detach();
5361 mSystemCpuTime.detach();
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07005362 mCpuPower.detach();
Adam Lesinski6832f392015-09-05 18:05:40 -07005363
5364 if (mCpuClusterSpeed != null) {
5365 for (LongSamplingCounter[] cpuSpeeds : mCpuClusterSpeed) {
5366 if (cpuSpeeds != null) {
5367 for (LongSamplingCounter c : cpuSpeeds) {
5368 if (c != null) {
5369 c.detach();
5370 }
5371 }
5372 }
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005373 }
5374 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005375 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005376
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005377 return !active;
5378 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005379
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005380 void writeToParcelLocked(Parcel out, long elapsedRealtimeUs) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07005381 final ArrayMap<String, Wakelock> wakeStats = mWakelockStats.getMap();
5382 int NW = wakeStats.size();
Dianne Hackborn61659e52014-07-09 16:13:01 -07005383 out.writeInt(NW);
5384 for (int iw=0; iw<NW; iw++) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07005385 out.writeString(wakeStats.keyAt(iw));
5386 Uid.Wakelock wakelock = wakeStats.valueAt(iw);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005387 wakelock.writeToParcelLocked(out, elapsedRealtimeUs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005388 }
5389
Dianne Hackbornd953c532014-08-16 18:17:38 -07005390 final ArrayMap<String, StopwatchTimer> syncStats = mSyncStats.getMap();
5391 int NS = syncStats.size();
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005392 out.writeInt(NS);
5393 for (int is=0; is<NS; is++) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07005394 out.writeString(syncStats.keyAt(is));
5395 StopwatchTimer timer = syncStats.valueAt(is);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005396 Timer.writeTimerToParcel(out, timer, elapsedRealtimeUs);
5397 }
5398
Dianne Hackbornd953c532014-08-16 18:17:38 -07005399 final ArrayMap<String, StopwatchTimer> jobStats = mJobStats.getMap();
5400 int NJ = jobStats.size();
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005401 out.writeInt(NJ);
5402 for (int ij=0; ij<NJ; ij++) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07005403 out.writeString(jobStats.keyAt(ij));
5404 StopwatchTimer timer = jobStats.valueAt(ij);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005405 Timer.writeTimerToParcel(out, timer, elapsedRealtimeUs);
5406 }
5407
Dianne Hackborn61659e52014-07-09 16:13:01 -07005408 int NSE = mSensorStats.size();
5409 out.writeInt(NSE);
5410 for (int ise=0; ise<NSE; ise++) {
5411 out.writeInt(mSensorStats.keyAt(ise));
5412 Uid.Sensor sensor = mSensorStats.valueAt(ise);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005413 sensor.writeToParcelLocked(out, elapsedRealtimeUs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005414 }
5415
Dianne Hackborn61659e52014-07-09 16:13:01 -07005416 int NP = mProcessStats.size();
5417 out.writeInt(NP);
5418 for (int ip=0; ip<NP; ip++) {
5419 out.writeString(mProcessStats.keyAt(ip));
5420 Uid.Proc proc = mProcessStats.valueAt(ip);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005421 proc.writeToParcelLocked(out);
5422 }
5423
5424 out.writeInt(mPackageStats.size());
5425 for (Map.Entry<String, Uid.Pkg> pkgEntry : mPackageStats.entrySet()) {
5426 out.writeString(pkgEntry.getKey());
5427 Uid.Pkg pkg = pkgEntry.getValue();
5428 pkg.writeToParcelLocked(out);
5429 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005430
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07005431 if (mWifiRunningTimer != null) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005432 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005433 mWifiRunningTimer.writeToParcel(out, elapsedRealtimeUs);
Dianne Hackborn617f8772009-03-31 15:04:46 -07005434 } else {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005435 out.writeInt(0);
5436 }
5437 if (mFullWifiLockTimer != null) {
5438 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005439 mFullWifiLockTimer.writeToParcel(out, elapsedRealtimeUs);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005440 } else {
5441 out.writeInt(0);
5442 }
Nick Pelly6ccaa542012-06-15 15:22:47 -07005443 if (mWifiScanTimer != null) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005444 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005445 mWifiScanTimer.writeToParcel(out, elapsedRealtimeUs);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005446 } else {
5447 out.writeInt(0);
5448 }
Robert Greenwalta029ea12013-09-25 16:38:12 -07005449 for (int i = 0; i < NUM_WIFI_BATCHED_SCAN_BINS; i++) {
5450 if (mWifiBatchedScanTimer[i] != null) {
5451 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005452 mWifiBatchedScanTimer[i].writeToParcel(out, elapsedRealtimeUs);
Robert Greenwalta029ea12013-09-25 16:38:12 -07005453 } else {
5454 out.writeInt(0);
5455 }
5456 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005457 if (mWifiMulticastTimer != null) {
5458 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005459 mWifiMulticastTimer.writeToParcel(out, elapsedRealtimeUs);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005460 } else {
5461 out.writeInt(0);
5462 }
Adam Lesinskie08af192015-03-25 16:42:59 -07005463
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005464 if (mAudioTurnedOnTimer != null) {
5465 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005466 mAudioTurnedOnTimer.writeToParcel(out, elapsedRealtimeUs);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005467 } else {
5468 out.writeInt(0);
5469 }
5470 if (mVideoTurnedOnTimer != null) {
5471 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005472 mVideoTurnedOnTimer.writeToParcel(out, elapsedRealtimeUs);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005473 } else {
5474 out.writeInt(0);
5475 }
Ruben Brunk6d2c3632015-05-26 17:32:16 -07005476 if (mFlashlightTurnedOnTimer != null) {
5477 out.writeInt(1);
5478 mFlashlightTurnedOnTimer.writeToParcel(out, elapsedRealtimeUs);
5479 } else {
5480 out.writeInt(0);
5481 }
5482 if (mCameraTurnedOnTimer != null) {
5483 out.writeInt(1);
5484 mCameraTurnedOnTimer.writeToParcel(out, elapsedRealtimeUs);
5485 } else {
5486 out.writeInt(0);
5487 }
Jeff Sharkey3e013e82013-04-25 14:48:19 -07005488 if (mForegroundActivityTimer != null) {
5489 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005490 mForegroundActivityTimer.writeToParcel(out, elapsedRealtimeUs);
Jeff Sharkey3e013e82013-04-25 14:48:19 -07005491 } else {
5492 out.writeInt(0);
5493 }
Dianne Hackborn61659e52014-07-09 16:13:01 -07005494 for (int i = 0; i < NUM_PROCESS_STATE; i++) {
5495 if (mProcessStateTimer[i] != null) {
5496 out.writeInt(1);
5497 mProcessStateTimer[i].writeToParcel(out, elapsedRealtimeUs);
5498 } else {
5499 out.writeInt(0);
5500 }
5501 }
Dianne Hackborna06de0f2012-12-11 16:34:47 -08005502 if (mVibratorOnTimer != null) {
5503 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005504 mVibratorOnTimer.writeToParcel(out, elapsedRealtimeUs);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08005505 } else {
5506 out.writeInt(0);
5507 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005508 if (mUserActivityCounters != null) {
Dianne Hackborn617f8772009-03-31 15:04:46 -07005509 out.writeInt(1);
5510 for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
5511 mUserActivityCounters[i].writeToParcel(out);
5512 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005513 } else {
5514 out.writeInt(0);
Dianne Hackborn617f8772009-03-31 15:04:46 -07005515 }
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005516 if (mNetworkByteActivityCounters != null) {
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005517 out.writeInt(1);
5518 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005519 mNetworkByteActivityCounters[i].writeToParcel(out);
5520 mNetworkPacketActivityCounters[i].writeToParcel(out);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005521 }
Dianne Hackbornd45665b2014-02-26 12:35:32 -08005522 mMobileRadioActiveTime.writeToParcel(out);
5523 mMobileRadioActiveCount.writeToParcel(out);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005524 } else {
5525 out.writeInt(0);
5526 }
Adam Lesinskie08af192015-03-25 16:42:59 -07005527
5528 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
5529 if (mWifiControllerTime[i] != null) {
5530 out.writeInt(1);
5531 mWifiControllerTime[i].writeToParcel(out);
5532 } else {
5533 out.writeInt(0);
5534 }
5535 }
5536
5537 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
5538 if (mBluetoothControllerTime[i] != null) {
5539 out.writeInt(1);
5540 mBluetoothControllerTime[i].writeToParcel(out);
5541 } else {
5542 out.writeInt(0);
5543 }
5544 }
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005545
5546 mUserCpuTime.writeToParcel(out);
5547 mSystemCpuTime.writeToParcel(out);
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07005548 mCpuPower.writeToParcel(out);
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005549
Adam Lesinski6832f392015-09-05 18:05:40 -07005550 if (mCpuClusterSpeed != null) {
5551 out.writeInt(1);
5552 out.writeInt(mCpuClusterSpeed.length);
5553 for (LongSamplingCounter[] cpuSpeeds : mCpuClusterSpeed) {
5554 if (cpuSpeeds != null) {
5555 out.writeInt(1);
5556 out.writeInt(cpuSpeeds.length);
5557 for (LongSamplingCounter c : cpuSpeeds) {
5558 if (c != null) {
5559 out.writeInt(1);
5560 c.writeToParcel(out);
5561 } else {
5562 out.writeInt(0);
5563 }
5564 }
5565 } else {
5566 out.writeInt(0);
5567 }
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005568 }
Adam Lesinski6832f392015-09-05 18:05:40 -07005569 } else {
5570 out.writeInt(0);
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005571 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005572 }
5573
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005574 void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005575 int numWakelocks = in.readInt();
5576 mWakelockStats.clear();
5577 for (int j = 0; j < numWakelocks; j++) {
5578 String wakelockName = in.readString();
5579 Uid.Wakelock wakelock = new Wakelock();
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005580 wakelock.readFromParcelLocked(timeBase, screenOffTimeBase, in);
Dianne Hackbornd953c532014-08-16 18:17:38 -07005581 mWakelockStats.add(wakelockName, wakelock);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005582 }
5583
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005584 int numSyncs = in.readInt();
5585 mSyncStats.clear();
5586 for (int j = 0; j < numSyncs; j++) {
5587 String syncName = in.readString();
5588 if (in.readInt() != 0) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07005589 mSyncStats.add(syncName,
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005590 new StopwatchTimer(Uid.this, SYNC, null, timeBase, in));
5591 }
5592 }
5593
5594 int numJobs = in.readInt();
5595 mJobStats.clear();
5596 for (int j = 0; j < numJobs; j++) {
5597 String jobName = in.readString();
5598 if (in.readInt() != 0) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07005599 mJobStats.add(jobName, new StopwatchTimer(Uid.this, JOB, null, timeBase, in));
Dianne Hackbornfdb19562014-07-11 16:03:36 -07005600 }
5601 }
5602
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005603 int numSensors = in.readInt();
5604 mSensorStats.clear();
5605 for (int k = 0; k < numSensors; k++) {
5606 int sensorNumber = in.readInt();
5607 Uid.Sensor sensor = new Sensor(sensorNumber);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005608 sensor.readFromParcelLocked(mOnBatteryTimeBase, in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005609 mSensorStats.put(sensorNumber, sensor);
5610 }
5611
5612 int numProcs = in.readInt();
5613 mProcessStats.clear();
5614 for (int k = 0; k < numProcs; k++) {
5615 String processName = in.readString();
Dianne Hackborncd0e3352014-08-07 17:08:09 -07005616 Uid.Proc proc = new Proc(processName);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005617 proc.readFromParcelLocked(in);
5618 mProcessStats.put(processName, proc);
5619 }
5620
5621 int numPkgs = in.readInt();
5622 mPackageStats.clear();
5623 for (int l = 0; l < numPkgs; l++) {
5624 String packageName = in.readString();
5625 Uid.Pkg pkg = new Pkg();
5626 pkg.readFromParcelLocked(in);
5627 mPackageStats.put(packageName, pkg);
5628 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005629
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07005630 mWifiRunning = false;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005631 if (in.readInt() != 0) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07005632 mWifiRunningTimer = new StopwatchTimer(Uid.this, WIFI_RUNNING,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005633 mWifiRunningTimers, mOnBatteryTimeBase, in);
Dianne Hackborn617f8772009-03-31 15:04:46 -07005634 } else {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07005635 mWifiRunningTimer = null;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005636 }
5637 mFullWifiLockOut = false;
5638 if (in.readInt() != 0) {
Dianne Hackborn0d903a82010-09-07 23:51:03 -07005639 mFullWifiLockTimer = new StopwatchTimer(Uid.this, FULL_WIFI_LOCK,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005640 mFullWifiLockTimers, mOnBatteryTimeBase, in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005641 } else {
5642 mFullWifiLockTimer = null;
5643 }
Nick Pelly6ccaa542012-06-15 15:22:47 -07005644 mWifiScanStarted = false;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005645 if (in.readInt() != 0) {
Nick Pelly6ccaa542012-06-15 15:22:47 -07005646 mWifiScanTimer = new StopwatchTimer(Uid.this, WIFI_SCAN,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005647 mWifiScanTimers, mOnBatteryTimeBase, in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005648 } else {
Nick Pelly6ccaa542012-06-15 15:22:47 -07005649 mWifiScanTimer = null;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005650 }
Robert Greenwalta029ea12013-09-25 16:38:12 -07005651 mWifiBatchedScanBinStarted = NO_BATCHED_SCAN_STARTED;
5652 for (int i = 0; i < NUM_WIFI_BATCHED_SCAN_BINS; i++) {
5653 if (in.readInt() != 0) {
5654 makeWifiBatchedScanBin(i, in);
5655 } else {
5656 mWifiBatchedScanTimer[i] = null;
5657 }
5658 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005659 mWifiMulticastEnabled = false;
5660 if (in.readInt() != 0) {
Dianne Hackborn0d903a82010-09-07 23:51:03 -07005661 mWifiMulticastTimer = new StopwatchTimer(Uid.this, WIFI_MULTICAST_ENABLED,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005662 mWifiMulticastTimers, mOnBatteryTimeBase, in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005663 } else {
5664 mWifiMulticastTimer = null;
5665 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005666 if (in.readInt() != 0) {
Dianne Hackborn0d903a82010-09-07 23:51:03 -07005667 mAudioTurnedOnTimer = new StopwatchTimer(Uid.this, AUDIO_TURNED_ON,
Dianne Hackborn10eaa852014-07-22 22:54:55 -07005668 mAudioTurnedOnTimers, mOnBatteryTimeBase, in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005669 } else {
5670 mAudioTurnedOnTimer = null;
5671 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005672 if (in.readInt() != 0) {
Dianne Hackborn0d903a82010-09-07 23:51:03 -07005673 mVideoTurnedOnTimer = new StopwatchTimer(Uid.this, VIDEO_TURNED_ON,
Dianne Hackborn10eaa852014-07-22 22:54:55 -07005674 mVideoTurnedOnTimers, mOnBatteryTimeBase, in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005675 } else {
5676 mVideoTurnedOnTimer = null;
5677 }
5678 if (in.readInt() != 0) {
Ruben Brunk6d2c3632015-05-26 17:32:16 -07005679 mFlashlightTurnedOnTimer = new StopwatchTimer(Uid.this, FLASHLIGHT_TURNED_ON,
5680 mFlashlightTurnedOnTimers, mOnBatteryTimeBase, in);
5681 } else {
5682 mFlashlightTurnedOnTimer = null;
5683 }
5684 if (in.readInt() != 0) {
5685 mCameraTurnedOnTimer = new StopwatchTimer(Uid.this, CAMERA_TURNED_ON,
5686 mCameraTurnedOnTimers, mOnBatteryTimeBase, in);
5687 } else {
5688 mCameraTurnedOnTimer = null;
5689 }
5690 if (in.readInt() != 0) {
Jeff Sharkey3e013e82013-04-25 14:48:19 -07005691 mForegroundActivityTimer = new StopwatchTimer(
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005692 Uid.this, FOREGROUND_ACTIVITY, null, mOnBatteryTimeBase, in);
Jeff Sharkey3e013e82013-04-25 14:48:19 -07005693 } else {
5694 mForegroundActivityTimer = null;
5695 }
Dianne Hackborn61659e52014-07-09 16:13:01 -07005696 mProcessState = PROCESS_STATE_NONE;
5697 for (int i = 0; i < NUM_PROCESS_STATE; i++) {
5698 if (in.readInt() != 0) {
5699 makeProcessState(i, in);
5700 } else {
5701 mProcessStateTimer[i] = null;
5702 }
5703 }
Jeff Sharkey3e013e82013-04-25 14:48:19 -07005704 if (in.readInt() != 0) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005705 mVibratorOnTimer = new BatchTimer(Uid.this, VIBRATOR_ON, mOnBatteryTimeBase, in);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08005706 } else {
5707 mVibratorOnTimer = null;
5708 }
5709 if (in.readInt() != 0) {
Dianne Hackborn617f8772009-03-31 15:04:46 -07005710 mUserActivityCounters = new Counter[NUM_USER_ACTIVITY_TYPES];
5711 for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005712 mUserActivityCounters[i] = new Counter(mOnBatteryTimeBase, in);
Dianne Hackborn617f8772009-03-31 15:04:46 -07005713 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005714 } else {
5715 mUserActivityCounters = null;
Dianne Hackborn617f8772009-03-31 15:04:46 -07005716 }
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005717 if (in.readInt() != 0) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005718 mNetworkByteActivityCounters = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES];
5719 mNetworkPacketActivityCounters
5720 = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES];
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005721 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005722 mNetworkByteActivityCounters[i]
5723 = new LongSamplingCounter(mOnBatteryTimeBase, in);
5724 mNetworkPacketActivityCounters[i]
5725 = new LongSamplingCounter(mOnBatteryTimeBase, in);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005726 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005727 mMobileRadioActiveTime = new LongSamplingCounter(mOnBatteryTimeBase, in);
5728 mMobileRadioActiveCount = new LongSamplingCounter(mOnBatteryTimeBase, in);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005729 } else {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08005730 mNetworkByteActivityCounters = null;
5731 mNetworkPacketActivityCounters = null;
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07005732 }
Adam Lesinskie08af192015-03-25 16:42:59 -07005733
5734 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
5735 if (in.readInt() != 0) {
5736 mWifiControllerTime[i] = new LongSamplingCounter(mOnBatteryTimeBase, in);
5737 } else {
5738 mWifiControllerTime[i] = null;
5739 }
5740 }
5741
5742 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
5743 if (in.readInt() != 0) {
5744 mBluetoothControllerTime[i] = new LongSamplingCounter(mOnBatteryTimeBase, in);
5745 } else {
5746 mBluetoothControllerTime[i] = null;
5747 }
5748 }
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005749
5750 mUserCpuTime = new LongSamplingCounter(mOnBatteryTimeBase, in);
5751 mSystemCpuTime = new LongSamplingCounter(mOnBatteryTimeBase, in);
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07005752 mCpuPower = new LongSamplingCounter(mOnBatteryTimeBase, in);
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005753
Adam Lesinski6832f392015-09-05 18:05:40 -07005754 if (in.readInt() != 0) {
5755 int numCpuClusters = in.readInt();
5756 if (mPowerProfile != null && mPowerProfile.getNumCpuClusters() != numCpuClusters) {
5757 throw new ParcelFormatException("Incompatible number of cpu clusters");
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005758 }
Adam Lesinski6832f392015-09-05 18:05:40 -07005759
5760 mCpuClusterSpeed = new LongSamplingCounter[numCpuClusters][];
5761 for (int cluster = 0; cluster < numCpuClusters; cluster++) {
5762 if (in.readInt() != 0) {
5763 int numSpeeds = in.readInt();
5764 if (mPowerProfile != null &&
5765 mPowerProfile.getNumSpeedStepsInCpuCluster(cluster) != numSpeeds) {
5766 throw new ParcelFormatException("Incompatible number of cpu speeds");
5767 }
5768
5769 final LongSamplingCounter[] cpuSpeeds = new LongSamplingCounter[numSpeeds];
5770 mCpuClusterSpeed[cluster] = cpuSpeeds;
5771 for (int speed = 0; speed < numSpeeds; speed++) {
5772 if (in.readInt() != 0) {
5773 cpuSpeeds[speed] = new LongSamplingCounter(mOnBatteryTimeBase, in);
5774 }
5775 }
Adam Lesinskia57a5402015-09-28 10:21:33 -07005776 } else {
5777 mCpuClusterSpeed[cluster] = null;
Adam Lesinski6832f392015-09-05 18:05:40 -07005778 }
5779 }
5780 } else {
5781 mCpuClusterSpeed = null;
Adam Lesinski06af1fa2015-05-05 17:35:35 -07005782 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005783 }
5784
5785 /**
5786 * The statistics associated with a particular wake lock.
5787 */
5788 public final class Wakelock extends BatteryStats.Uid.Wakelock {
5789 /**
5790 * How long (in ms) this uid has been keeping the device partially awake.
5791 */
Evan Millarc64edde2009-04-18 12:26:32 -07005792 StopwatchTimer mTimerPartial;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005793
5794 /**
5795 * How long (in ms) this uid has been keeping the device fully awake.
5796 */
Evan Millarc64edde2009-04-18 12:26:32 -07005797 StopwatchTimer mTimerFull;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005798
5799 /**
5800 * How long (in ms) this uid has had a window keeping the device awake.
5801 */
Evan Millarc64edde2009-04-18 12:26:32 -07005802 StopwatchTimer mTimerWindow;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005803
5804 /**
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005805 * How long (in ms) this uid has had a draw wake lock.
Adam Lesinski9425fe22015-06-19 12:02:13 -07005806 */
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005807 StopwatchTimer mTimerDraw;
Adam Lesinski9425fe22015-06-19 12:02:13 -07005808
5809 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005810 * Reads a possibly null Timer from a Parcel. The timer is associated with the
5811 * proper timer pool from the given BatteryStatsImpl object.
5812 *
5813 * @param in the Parcel to be read from.
5814 * return a new Timer, or null.
5815 */
Evan Millarc64edde2009-04-18 12:26:32 -07005816 private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005817 TimeBase timeBase, Parcel in) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005818 if (in.readInt() == 0) {
5819 return null;
5820 }
5821
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005822 return new StopwatchTimer(Uid.this, type, pool, timeBase, in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005823 }
5824
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005825 boolean reset() {
5826 boolean wlactive = false;
5827 if (mTimerFull != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005828 wlactive |= !mTimerFull.reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005829 }
5830 if (mTimerPartial != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005831 wlactive |= !mTimerPartial.reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005832 }
5833 if (mTimerWindow != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005834 wlactive |= !mTimerWindow.reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005835 }
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005836 if (mTimerDraw != null) {
5837 wlactive |= !mTimerDraw.reset(false);
Adam Lesinski9425fe22015-06-19 12:02:13 -07005838 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005839 if (!wlactive) {
5840 if (mTimerFull != null) {
5841 mTimerFull.detach();
5842 mTimerFull = null;
5843 }
5844 if (mTimerPartial != null) {
5845 mTimerPartial.detach();
5846 mTimerPartial = null;
5847 }
5848 if (mTimerWindow != null) {
5849 mTimerWindow.detach();
5850 mTimerWindow = null;
5851 }
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005852 if (mTimerDraw != null) {
5853 mTimerDraw.detach();
5854 mTimerDraw = null;
Adam Lesinski9425fe22015-06-19 12:02:13 -07005855 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005856 }
5857 return !wlactive;
5858 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005859
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005860 void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005861 mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL,
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005862 mPartialTimers, screenOffTimeBase, in);
Adam Lesinski9425fe22015-06-19 12:02:13 -07005863 mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, mFullTimers, timeBase, in);
5864 mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, mWindowTimers, timeBase, in);
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005865 mTimerDraw = readTimerFromParcel(WAKE_TYPE_DRAW, mDrawTimers, timeBase, in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005866 }
5867
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005868 void writeToParcelLocked(Parcel out, long elapsedRealtimeUs) {
5869 Timer.writeTimerToParcel(out, mTimerPartial, elapsedRealtimeUs);
5870 Timer.writeTimerToParcel(out, mTimerFull, elapsedRealtimeUs);
5871 Timer.writeTimerToParcel(out, mTimerWindow, elapsedRealtimeUs);
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005872 Timer.writeTimerToParcel(out, mTimerDraw, elapsedRealtimeUs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005873 }
5874
5875 @Override
5876 public Timer getWakeTime(int type) {
5877 switch (type) {
5878 case WAKE_TYPE_FULL: return mTimerFull;
5879 case WAKE_TYPE_PARTIAL: return mTimerPartial;
5880 case WAKE_TYPE_WINDOW: return mTimerWindow;
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005881 case WAKE_TYPE_DRAW: return mTimerDraw;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005882 default: throw new IllegalArgumentException("type = " + type);
5883 }
5884 }
Dianne Hackbornd953c532014-08-16 18:17:38 -07005885
5886 public StopwatchTimer getStopwatchTimer(int type) {
5887 StopwatchTimer t;
5888 switch (type) {
5889 case WAKE_TYPE_PARTIAL:
5890 t = mTimerPartial;
5891 if (t == null) {
5892 t = new StopwatchTimer(Uid.this, WAKE_TYPE_PARTIAL,
5893 mPartialTimers, mOnBatteryScreenOffTimeBase);
5894 mTimerPartial = t;
5895 }
5896 return t;
5897 case WAKE_TYPE_FULL:
5898 t = mTimerFull;
5899 if (t == null) {
5900 t = new StopwatchTimer(Uid.this, WAKE_TYPE_FULL,
5901 mFullTimers, mOnBatteryTimeBase);
5902 mTimerFull = t;
5903 }
5904 return t;
5905 case WAKE_TYPE_WINDOW:
5906 t = mTimerWindow;
5907 if (t == null) {
5908 t = new StopwatchTimer(Uid.this, WAKE_TYPE_WINDOW,
5909 mWindowTimers, mOnBatteryTimeBase);
5910 mTimerWindow = t;
5911 }
5912 return t;
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005913 case WAKE_TYPE_DRAW:
5914 t = mTimerDraw;
Adam Lesinski9425fe22015-06-19 12:02:13 -07005915 if (t == null) {
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005916 t = new StopwatchTimer(Uid.this, WAKE_TYPE_DRAW,
5917 mDrawTimers, mOnBatteryTimeBase);
5918 mTimerDraw = t;
Adam Lesinski9425fe22015-06-19 12:02:13 -07005919 }
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07005920 return t;
Dianne Hackbornd953c532014-08-16 18:17:38 -07005921 default:
5922 throw new IllegalArgumentException("type=" + type);
5923 }
5924 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005925 }
5926
5927 public final class Sensor extends BatteryStats.Uid.Sensor {
5928 final int mHandle;
Evan Millarc64edde2009-04-18 12:26:32 -07005929 StopwatchTimer mTimer;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005930
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005931 public Sensor(int handle) {
5932 mHandle = handle;
5933 }
5934
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005935 private StopwatchTimer readTimerFromParcel(TimeBase timeBase, Parcel in) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005936 if (in.readInt() == 0) {
5937 return null;
5938 }
5939
Evan Millarc64edde2009-04-18 12:26:32 -07005940 ArrayList<StopwatchTimer> pool = mSensorTimers.get(mHandle);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005941 if (pool == null) {
Evan Millarc64edde2009-04-18 12:26:32 -07005942 pool = new ArrayList<StopwatchTimer>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005943 mSensorTimers.put(mHandle, pool);
5944 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005945 return new StopwatchTimer(Uid.this, 0, pool, timeBase, in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005946 }
5947
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005948 boolean reset() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005949 if (mTimer.reset(true)) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07005950 mTimer = null;
5951 return true;
5952 }
5953 return false;
5954 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07005955
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005956 void readFromParcelLocked(TimeBase timeBase, Parcel in) {
5957 mTimer = readTimerFromParcel(timeBase, in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005958 }
5959
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005960 void writeToParcelLocked(Parcel out, long elapsedRealtimeUs) {
5961 Timer.writeTimerToParcel(out, mTimer, elapsedRealtimeUs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005962 }
5963
5964 @Override
5965 public Timer getSensorTime() {
5966 return mTimer;
5967 }
Amith Yamasanieaeb6632009-06-03 15:16:10 -07005968
5969 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005970 public int getHandle() {
5971 return mHandle;
5972 }
5973 }
5974
5975 /**
5976 * The statistics associated with a particular process.
5977 */
Dianne Hackborn97ae5382014-03-05 16:43:25 -08005978 public final class Proc extends BatteryStats.Uid.Proc implements TimeBaseObs {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005979 /**
Dianne Hackborncd0e3352014-08-07 17:08:09 -07005980 * The name of this process.
5981 */
5982 final String mName;
5983
5984 /**
Dianne Hackborn099bc622014-01-22 13:39:16 -08005985 * Remains true until removed from the stats.
5986 */
5987 boolean mActive = true;
5988
5989 /**
Dianne Hackborn62793e42015-03-09 11:15:41 -07005990 * Total time (in ms) spent executing in user code.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005991 */
5992 long mUserTime;
5993
5994 /**
Dianne Hackborn62793e42015-03-09 11:15:41 -07005995 * Total time (in ms) spent executing in kernel code.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005996 */
5997 long mSystemTime;
5998
5999 /**
Dianne Hackborn62793e42015-03-09 11:15:41 -07006000 * Amount of time (in ms) the process was running in the foreground.
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006001 */
6002 long mForegroundTime;
6003
6004 /**
Jeff Sharkey3e013e82013-04-25 14:48:19 -07006005 * Number of times the process has been started.
6006 */
6007 int mStarts;
6008
6009 /**
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006010 * Number of times the process has crashed.
6011 */
6012 int mNumCrashes;
6013
6014 /**
6015 * Number of times the process has had an ANR.
6016 */
6017 int mNumAnrs;
6018
6019 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006020 * The amount of user time loaded from a previous save.
6021 */
6022 long mLoadedUserTime;
6023
6024 /**
6025 * The amount of system time loaded from a previous save.
6026 */
6027 long mLoadedSystemTime;
6028
6029 /**
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006030 * The amount of foreground time loaded from a previous save.
6031 */
6032 long mLoadedForegroundTime;
6033
6034 /**
Jeff Sharkey3e013e82013-04-25 14:48:19 -07006035 * The number of times the process has started from a previous save.
6036 */
6037 int mLoadedStarts;
6038
6039 /**
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006040 * Number of times the process has crashed from a previous save.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006041 */
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006042 int mLoadedNumCrashes;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006043
6044 /**
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006045 * Number of times the process has had an ANR from a previous save.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006046 */
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006047 int mLoadedNumAnrs;
Jeff Sharkey3e013e82013-04-25 14:48:19 -07006048
6049 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006050 * The amount of user time when last unplugged.
6051 */
6052 long mUnpluggedUserTime;
6053
6054 /**
6055 * The amount of system time when last unplugged.
6056 */
6057 long mUnpluggedSystemTime;
6058
6059 /**
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006060 * The amount of foreground time since unplugged.
6061 */
6062 long mUnpluggedForegroundTime;
6063
Jeff Sharkey3e013e82013-04-25 14:48:19 -07006064 /**
6065 * The number of times the process has started before unplugged.
6066 */
6067 int mUnpluggedStarts;
6068
Dianne Hackborn61659e52014-07-09 16:13:01 -07006069 /**
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006070 * Number of times the process has crashed before unplugged.
6071 */
6072 int mUnpluggedNumCrashes;
6073
6074 /**
6075 * Number of times the process has had an ANR before unplugged.
6076 */
6077 int mUnpluggedNumAnrs;
6078
6079 /**
Dianne Hackborn61659e52014-07-09 16:13:01 -07006080 * Current process state.
6081 */
6082 int mProcessState = PROCESS_STATE_NONE;
6083
Dianne Hackborn287952c2010-09-22 22:34:31 -07006084 ArrayList<ExcessivePower> mExcessivePower;
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006085
Dianne Hackborncd0e3352014-08-07 17:08:09 -07006086 Proc(String name) {
6087 mName = name;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006088 mOnBatteryTimeBase.add(this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006089 }
Amith Yamasanie43530a2009-08-21 13:11:37 -07006090
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006091 public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006092 mUnpluggedUserTime = mUserTime;
6093 mUnpluggedSystemTime = mSystemTime;
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006094 mUnpluggedForegroundTime = mForegroundTime;
Jeff Sharkey3e013e82013-04-25 14:48:19 -07006095 mUnpluggedStarts = mStarts;
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006096 mUnpluggedNumCrashes = mNumCrashes;
6097 mUnpluggedNumAnrs = mNumAnrs;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006098 }
6099
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006100 public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006101 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006102
Dianne Hackborncd0e3352014-08-07 17:08:09 -07006103 void reset() {
6104 mUserTime = mSystemTime = mForegroundTime = 0;
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006105 mStarts = mNumCrashes = mNumAnrs = 0;
Dianne Hackborncd0e3352014-08-07 17:08:09 -07006106 mLoadedUserTime = mLoadedSystemTime = mLoadedForegroundTime = 0;
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006107 mLoadedStarts = mLoadedNumCrashes = mLoadedNumAnrs = 0;
Dianne Hackborncd0e3352014-08-07 17:08:09 -07006108 mUnpluggedUserTime = mUnpluggedSystemTime = mUnpluggedForegroundTime = 0;
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006109 mUnpluggedStarts = mUnpluggedNumCrashes = mUnpluggedNumAnrs = 0;
Dianne Hackborncd0e3352014-08-07 17:08:09 -07006110 mExcessivePower = null;
6111 }
6112
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07006113 void detach() {
Dianne Hackborn099bc622014-01-22 13:39:16 -08006114 mActive = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006115 mOnBatteryTimeBase.remove(this);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07006116 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006117
Dianne Hackborn287952c2010-09-22 22:34:31 -07006118 public int countExcessivePowers() {
6119 return mExcessivePower != null ? mExcessivePower.size() : 0;
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006120 }
6121
Dianne Hackborn287952c2010-09-22 22:34:31 -07006122 public ExcessivePower getExcessivePower(int i) {
6123 if (mExcessivePower != null) {
6124 return mExcessivePower.get(i);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006125 }
6126 return null;
6127 }
6128
6129 public void addExcessiveWake(long overTime, long usedTime) {
Dianne Hackborn287952c2010-09-22 22:34:31 -07006130 if (mExcessivePower == null) {
6131 mExcessivePower = new ArrayList<ExcessivePower>();
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006132 }
Dianne Hackborn287952c2010-09-22 22:34:31 -07006133 ExcessivePower ew = new ExcessivePower();
6134 ew.type = ExcessivePower.TYPE_WAKE;
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006135 ew.overTime = overTime;
6136 ew.usedTime = usedTime;
Dianne Hackborn287952c2010-09-22 22:34:31 -07006137 mExcessivePower.add(ew);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006138 }
6139
Dianne Hackborn287952c2010-09-22 22:34:31 -07006140 public void addExcessiveCpu(long overTime, long usedTime) {
6141 if (mExcessivePower == null) {
6142 mExcessivePower = new ArrayList<ExcessivePower>();
6143 }
6144 ExcessivePower ew = new ExcessivePower();
6145 ew.type = ExcessivePower.TYPE_CPU;
6146 ew.overTime = overTime;
6147 ew.usedTime = usedTime;
6148 mExcessivePower.add(ew);
6149 }
6150
6151 void writeExcessivePowerToParcelLocked(Parcel out) {
6152 if (mExcessivePower == null) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006153 out.writeInt(0);
6154 return;
6155 }
6156
Dianne Hackborn287952c2010-09-22 22:34:31 -07006157 final int N = mExcessivePower.size();
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006158 out.writeInt(N);
6159 for (int i=0; i<N; i++) {
Dianne Hackborn287952c2010-09-22 22:34:31 -07006160 ExcessivePower ew = mExcessivePower.get(i);
6161 out.writeInt(ew.type);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006162 out.writeLong(ew.overTime);
6163 out.writeLong(ew.usedTime);
6164 }
6165 }
6166
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07006167 void readExcessivePowerFromParcelLocked(Parcel in) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006168 final int N = in.readInt();
6169 if (N == 0) {
Dianne Hackborn287952c2010-09-22 22:34:31 -07006170 mExcessivePower = null;
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07006171 return;
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006172 }
6173
Dianne Hackborn7b9c56f2010-12-07 11:14:53 -08006174 if (N > 10000) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07006175 throw new ParcelFormatException(
6176 "File corrupt: too many excessive power entries " + N);
Dianne Hackborn7b9c56f2010-12-07 11:14:53 -08006177 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07006178
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07006179 mExcessivePower = new ArrayList<>();
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006180 for (int i=0; i<N; i++) {
Dianne Hackborn287952c2010-09-22 22:34:31 -07006181 ExcessivePower ew = new ExcessivePower();
6182 ew.type = in.readInt();
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006183 ew.overTime = in.readLong();
6184 ew.usedTime = in.readLong();
Dianne Hackborn287952c2010-09-22 22:34:31 -07006185 mExcessivePower.add(ew);
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006186 }
6187 }
6188
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006189 void writeToParcelLocked(Parcel out) {
6190 out.writeLong(mUserTime);
6191 out.writeLong(mSystemTime);
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006192 out.writeLong(mForegroundTime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006193 out.writeInt(mStarts);
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006194 out.writeInt(mNumCrashes);
6195 out.writeInt(mNumAnrs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006196 out.writeLong(mLoadedUserTime);
6197 out.writeLong(mLoadedSystemTime);
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006198 out.writeLong(mLoadedForegroundTime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006199 out.writeInt(mLoadedStarts);
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006200 out.writeInt(mLoadedNumCrashes);
6201 out.writeInt(mLoadedNumAnrs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006202 out.writeLong(mUnpluggedUserTime);
6203 out.writeLong(mUnpluggedSystemTime);
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006204 out.writeLong(mUnpluggedForegroundTime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006205 out.writeInt(mUnpluggedStarts);
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006206 out.writeInt(mUnpluggedNumCrashes);
6207 out.writeInt(mUnpluggedNumAnrs);
Dianne Hackborn287952c2010-09-22 22:34:31 -07006208 writeExcessivePowerToParcelLocked(out);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006209 }
6210
6211 void readFromParcelLocked(Parcel in) {
6212 mUserTime = in.readLong();
6213 mSystemTime = in.readLong();
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006214 mForegroundTime = in.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006215 mStarts = in.readInt();
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006216 mNumCrashes = in.readInt();
6217 mNumAnrs = in.readInt();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006218 mLoadedUserTime = in.readLong();
6219 mLoadedSystemTime = in.readLong();
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006220 mLoadedForegroundTime = in.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006221 mLoadedStarts = in.readInt();
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006222 mLoadedNumCrashes = in.readInt();
6223 mLoadedNumAnrs = in.readInt();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006224 mUnpluggedUserTime = in.readLong();
6225 mUnpluggedSystemTime = in.readLong();
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006226 mUnpluggedForegroundTime = in.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006227 mUnpluggedStarts = in.readInt();
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006228 mUnpluggedNumCrashes = in.readInt();
6229 mUnpluggedNumAnrs = in.readInt();
Dianne Hackborn287952c2010-09-22 22:34:31 -07006230 readExcessivePowerFromParcelLocked(in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006231 }
6232
Adam Lesinski06af1fa2015-05-05 17:35:35 -07006233 public void addCpuTimeLocked(int utime, int stime) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006234 mUserTime += utime;
6235 mSystemTime += stime;
6236 }
6237
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006238 public void addForegroundTimeLocked(long ttime) {
6239 mForegroundTime += ttime;
6240 }
6241
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006242 public void incStartsLocked() {
6243 mStarts++;
6244 }
6245
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006246 public void incNumCrashesLocked() {
6247 mNumCrashes++;
6248 }
6249
6250 public void incNumAnrsLocked() {
6251 mNumAnrs++;
6252 }
6253
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006254 @Override
Dianne Hackborn099bc622014-01-22 13:39:16 -08006255 public boolean isActive() {
6256 return mActive;
6257 }
6258
6259 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006260 public long getUserTime(int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -07006261 long val = mUserTime;
6262 if (which == STATS_CURRENT) {
6263 val -= mLoadedUserTime;
6264 } else if (which == STATS_SINCE_UNPLUGGED) {
6265 val -= mUnpluggedUserTime;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006266 }
6267 return val;
6268 }
6269
6270 @Override
6271 public long getSystemTime(int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -07006272 long val = mSystemTime;
6273 if (which == STATS_CURRENT) {
6274 val -= mLoadedSystemTime;
6275 } else if (which == STATS_SINCE_UNPLUGGED) {
6276 val -= mUnpluggedSystemTime;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006277 }
6278 return val;
6279 }
6280
6281 @Override
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006282 public long getForegroundTime(int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -07006283 long val = mForegroundTime;
6284 if (which == STATS_CURRENT) {
6285 val -= mLoadedForegroundTime;
6286 } else if (which == STATS_SINCE_UNPLUGGED) {
6287 val -= mUnpluggedForegroundTime;
Amith Yamasanieaeb6632009-06-03 15:16:10 -07006288 }
6289 return val;
6290 }
6291
6292 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006293 public int getStarts(int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -07006294 int val = mStarts;
6295 if (which == STATS_CURRENT) {
6296 val -= mLoadedStarts;
6297 } else if (which == STATS_SINCE_UNPLUGGED) {
6298 val -= mUnpluggedStarts;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006299 }
6300 return val;
6301 }
Amith Yamasanie43530a2009-08-21 13:11:37 -07006302
Dianne Hackborn1e01d162014-12-04 17:46:42 -08006303 @Override
6304 public int getNumCrashes(int which) {
6305 int val = mNumCrashes;
6306 if (which == STATS_CURRENT) {
6307 val -= mLoadedNumCrashes;
6308 } else if (which == STATS_SINCE_UNPLUGGED) {
6309 val -= mUnpluggedNumCrashes;
6310 }
6311 return val;
6312 }
6313
6314 @Override
6315 public int getNumAnrs(int which) {
6316 int val = mNumAnrs;
6317 if (which == STATS_CURRENT) {
6318 val -= mLoadedNumAnrs;
6319 } else if (which == STATS_SINCE_UNPLUGGED) {
6320 val -= mUnpluggedNumAnrs;
6321 }
6322 return val;
6323 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006324 }
6325
6326 /**
6327 * The statistics associated with a particular package.
6328 */
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006329 public final class Pkg extends BatteryStats.Uid.Pkg implements TimeBaseObs {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006330 /**
Dianne Hackborn1e725a72015-03-24 18:23:19 -07006331 * Number of times wakeup alarms have occurred for this app.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006332 */
Dianne Hackborn1e725a72015-03-24 18:23:19 -07006333 ArrayMap<String, Counter> mWakeupAlarms = new ArrayMap<>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006334
6335 /**
6336 * The statics we have collected for this package's services.
6337 */
Dianne Hackborn1e725a72015-03-24 18:23:19 -07006338 final ArrayMap<String, Serv> mServiceStats = new ArrayMap<>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006339
6340 Pkg() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006341 mOnBatteryScreenOffTimeBase.add(this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006342 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006343
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006344 public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006345 }
6346
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006347 public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006348 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006349
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07006350 void detach() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006351 mOnBatteryScreenOffTimeBase.remove(this);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07006352 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006353
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006354 void readFromParcelLocked(Parcel in) {
Dianne Hackborn1e725a72015-03-24 18:23:19 -07006355 int numWA = in.readInt();
6356 mWakeupAlarms.clear();
6357 for (int i=0; i<numWA; i++) {
6358 String tag = in.readString();
6359 mWakeupAlarms.put(tag, new Counter(mOnBatteryTimeBase, in));
6360 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006361
6362 int numServs = in.readInt();
6363 mServiceStats.clear();
6364 for (int m = 0; m < numServs; m++) {
6365 String serviceName = in.readString();
6366 Uid.Pkg.Serv serv = new Serv();
6367 mServiceStats.put(serviceName, serv);
6368
6369 serv.readFromParcelLocked(in);
6370 }
6371 }
6372
6373 void writeToParcelLocked(Parcel out) {
Dianne Hackborn1e725a72015-03-24 18:23:19 -07006374 int numWA = mWakeupAlarms.size();
6375 out.writeInt(numWA);
6376 for (int i=0; i<numWA; i++) {
6377 out.writeString(mWakeupAlarms.keyAt(i));
6378 mWakeupAlarms.valueAt(i).writeToParcel(out);
6379 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006380
Dianne Hackborn1e725a72015-03-24 18:23:19 -07006381 final int NS = mServiceStats.size();
6382 out.writeInt(NS);
6383 for (int i=0; i<NS; i++) {
6384 out.writeString(mServiceStats.keyAt(i));
6385 Uid.Pkg.Serv serv = mServiceStats.valueAt(i);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006386 serv.writeToParcelLocked(out);
6387 }
6388 }
6389
6390 @Override
Dianne Hackborn1e725a72015-03-24 18:23:19 -07006391 public ArrayMap<String, ? extends BatteryStats.Counter> getWakeupAlarmStats() {
6392 return mWakeupAlarms;
6393 }
6394
6395 public void noteWakeupAlarmLocked(String tag) {
6396 Counter c = mWakeupAlarms.get(tag);
6397 if (c == null) {
6398 c = new Counter(mOnBatteryTimeBase);
6399 mWakeupAlarms.put(tag, c);
6400 }
6401 c.stepAtomic();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006402 }
6403
6404 @Override
Dianne Hackborn1e725a72015-03-24 18:23:19 -07006405 public ArrayMap<String, ? extends BatteryStats.Uid.Pkg.Serv> getServiceStats() {
6406 return mServiceStats;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006407 }
6408
6409 /**
6410 * The statistics associated with a particular service.
6411 */
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006412 public final class Serv extends BatteryStats.Uid.Pkg.Serv implements TimeBaseObs {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006413 /**
6414 * Total time (ms in battery uptime) the service has been left started.
6415 */
6416 long mStartTime;
6417
6418 /**
6419 * If service has been started and not yet stopped, this is
6420 * when it was started.
6421 */
6422 long mRunningSince;
6423
6424 /**
6425 * True if we are currently running.
6426 */
6427 boolean mRunning;
6428
6429 /**
6430 * Total number of times startService() has been called.
6431 */
6432 int mStarts;
6433
6434 /**
6435 * Total time (ms in battery uptime) the service has been left launched.
6436 */
6437 long mLaunchedTime;
6438
6439 /**
6440 * If service has been launched and not yet exited, this is
6441 * when it was launched (ms in battery uptime).
6442 */
6443 long mLaunchedSince;
6444
6445 /**
6446 * True if we are currently launched.
6447 */
6448 boolean mLaunched;
6449
6450 /**
6451 * Total number times the service has been launched.
6452 */
6453 int mLaunches;
6454
6455 /**
6456 * The amount of time spent started loaded from a previous save
6457 * (ms in battery uptime).
6458 */
6459 long mLoadedStartTime;
6460
6461 /**
6462 * The number of starts loaded from a previous save.
6463 */
6464 int mLoadedStarts;
6465
6466 /**
6467 * The number of launches loaded from a previous save.
6468 */
6469 int mLoadedLaunches;
6470
6471 /**
6472 * The amount of time spent started as of the last run (ms
6473 * in battery uptime).
6474 */
6475 long mLastStartTime;
6476
6477 /**
6478 * The number of starts as of the last run.
6479 */
6480 int mLastStarts;
6481
6482 /**
6483 * The number of launches as of the last run.
6484 */
6485 int mLastLaunches;
6486
6487 /**
6488 * The amount of time spent started when last unplugged (ms
6489 * in battery uptime).
6490 */
6491 long mUnpluggedStartTime;
6492
6493 /**
6494 * The number of starts when last unplugged.
6495 */
6496 int mUnpluggedStarts;
6497
6498 /**
6499 * The number of launches when last unplugged.
6500 */
6501 int mUnpluggedLaunches;
6502
6503 Serv() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006504 mOnBatteryTimeBase.add(this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006505 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006506
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006507 public void onTimeStarted(long elapsedRealtime, long baseUptime,
6508 long baseRealtime) {
6509 mUnpluggedStartTime = getStartTimeToNowLocked(baseUptime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006510 mUnpluggedStarts = mStarts;
6511 mUnpluggedLaunches = mLaunches;
6512 }
6513
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006514 public void onTimeStopped(long elapsedRealtime, long baseUptime,
6515 long baseRealtime) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006516 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006517
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07006518 void detach() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006519 mOnBatteryTimeBase.remove(this);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07006520 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006521
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006522 void readFromParcelLocked(Parcel in) {
6523 mStartTime = in.readLong();
6524 mRunningSince = in.readLong();
6525 mRunning = in.readInt() != 0;
6526 mStarts = in.readInt();
6527 mLaunchedTime = in.readLong();
6528 mLaunchedSince = in.readLong();
6529 mLaunched = in.readInt() != 0;
6530 mLaunches = in.readInt();
6531 mLoadedStartTime = in.readLong();
6532 mLoadedStarts = in.readInt();
6533 mLoadedLaunches = in.readInt();
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07006534 mLastStartTime = 0;
6535 mLastStarts = 0;
6536 mLastLaunches = 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006537 mUnpluggedStartTime = in.readLong();
6538 mUnpluggedStarts = in.readInt();
6539 mUnpluggedLaunches = in.readInt();
6540 }
6541
6542 void writeToParcelLocked(Parcel out) {
6543 out.writeLong(mStartTime);
6544 out.writeLong(mRunningSince);
6545 out.writeInt(mRunning ? 1 : 0);
6546 out.writeInt(mStarts);
6547 out.writeLong(mLaunchedTime);
6548 out.writeLong(mLaunchedSince);
6549 out.writeInt(mLaunched ? 1 : 0);
6550 out.writeInt(mLaunches);
6551 out.writeLong(mLoadedStartTime);
6552 out.writeInt(mLoadedStarts);
6553 out.writeInt(mLoadedLaunches);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006554 out.writeLong(mUnpluggedStartTime);
6555 out.writeInt(mUnpluggedStarts);
6556 out.writeInt(mUnpluggedLaunches);
6557 }
6558
6559 long getLaunchTimeToNowLocked(long batteryUptime) {
6560 if (!mLaunched) return mLaunchedTime;
6561 return mLaunchedTime + batteryUptime - mLaunchedSince;
6562 }
6563
6564 long getStartTimeToNowLocked(long batteryUptime) {
6565 if (!mRunning) return mStartTime;
6566 return mStartTime + batteryUptime - mRunningSince;
6567 }
6568
6569 public void startLaunchedLocked() {
6570 if (!mLaunched) {
6571 mLaunches++;
6572 mLaunchedSince = getBatteryUptimeLocked();
6573 mLaunched = true;
6574 }
6575 }
6576
6577 public void stopLaunchedLocked() {
6578 if (mLaunched) {
6579 long time = getBatteryUptimeLocked() - mLaunchedSince;
6580 if (time > 0) {
6581 mLaunchedTime += time;
6582 } else {
6583 mLaunches--;
6584 }
6585 mLaunched = false;
6586 }
6587 }
6588
6589 public void startRunningLocked() {
6590 if (!mRunning) {
6591 mStarts++;
6592 mRunningSince = getBatteryUptimeLocked();
6593 mRunning = true;
6594 }
6595 }
6596
6597 public void stopRunningLocked() {
6598 if (mRunning) {
6599 long time = getBatteryUptimeLocked() - mRunningSince;
6600 if (time > 0) {
6601 mStartTime += time;
6602 } else {
6603 mStarts--;
6604 }
6605 mRunning = false;
6606 }
6607 }
6608
6609 public BatteryStatsImpl getBatteryStats() {
6610 return BatteryStatsImpl.this;
6611 }
6612
6613 @Override
6614 public int getLaunches(int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -07006615 int val = mLaunches;
6616 if (which == STATS_CURRENT) {
6617 val -= mLoadedLaunches;
6618 } else if (which == STATS_SINCE_UNPLUGGED) {
6619 val -= mUnpluggedLaunches;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006620 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006621 return val;
6622 }
6623
6624 @Override
6625 public long getStartTime(long now, int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -07006626 long val = getStartTimeToNowLocked(now);
6627 if (which == STATS_CURRENT) {
6628 val -= mLoadedStartTime;
6629 } else if (which == STATS_SINCE_UNPLUGGED) {
6630 val -= mUnpluggedStartTime;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006631 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006632 return val;
6633 }
6634
6635 @Override
6636 public int getStarts(int which) {
Dianne Hackborn4590e522014-03-24 13:36:46 -07006637 int val = mStarts;
6638 if (which == STATS_CURRENT) {
6639 val -= mLoadedStarts;
6640 } else if (which == STATS_SINCE_UNPLUGGED) {
6641 val -= mUnpluggedStarts;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006642 }
6643
6644 return val;
6645 }
6646 }
6647
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006648 final Serv newServiceStatsLocked() {
6649 return new Serv();
6650 }
6651 }
6652
6653 /**
6654 * Retrieve the statistics object for a particular process, creating
6655 * if needed.
6656 */
6657 public Proc getProcessStatsLocked(String name) {
6658 Proc ps = mProcessStats.get(name);
6659 if (ps == null) {
Dianne Hackborncd0e3352014-08-07 17:08:09 -07006660 ps = new Proc(name);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006661 mProcessStats.put(name, ps);
6662 }
6663
6664 return ps;
6665 }
6666
Dianne Hackborn61659e52014-07-09 16:13:01 -07006667 public void updateProcessStateLocked(String procName, int state, long elapsedRealtimeMs) {
6668 int procState;
6669 if (state <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
6670 procState = PROCESS_STATE_FOREGROUND;
6671 } else if (state <= ActivityManager.PROCESS_STATE_RECEIVER) {
6672 procState = PROCESS_STATE_ACTIVE;
6673 } else {
6674 procState = PROCESS_STATE_RUNNING;
6675 }
6676 updateRealProcessStateLocked(procName, procState, elapsedRealtimeMs);
6677 }
6678
6679 public void updateRealProcessStateLocked(String procName, int procState,
6680 long elapsedRealtimeMs) {
6681 Proc proc = getProcessStatsLocked(procName);
6682 if (proc.mProcessState != procState) {
6683 boolean changed;
6684 if (procState < proc.mProcessState) {
6685 // Has this process become more important? If so,
6686 // we may need to change the uid if the currrent uid proc state
6687 // is not as important as what we are now setting.
6688 changed = mProcessState > procState;
6689 } else {
6690 // Has this process become less important? If so,
6691 // we may need to change the uid if the current uid proc state
6692 // is the same importance as the old setting.
6693 changed = mProcessState == proc.mProcessState;
6694 }
6695 proc.mProcessState = procState;
6696 if (changed) {
6697 // uid's state may have changed; compute what the new state should be.
6698 int uidProcState = PROCESS_STATE_NONE;
6699 for (int ip=mProcessStats.size()-1; ip>=0; ip--) {
6700 proc = mProcessStats.valueAt(ip);
6701 if (proc.mProcessState < uidProcState) {
6702 uidProcState = proc.mProcessState;
6703 }
6704 }
6705 updateUidProcessStateLocked(uidProcState, elapsedRealtimeMs);
6706 }
6707 }
6708 }
6709
Dianne Hackbornb5e31652010-09-07 12:13:55 -07006710 public SparseArray<? extends Pid> getPidStats() {
6711 return mPids;
6712 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006713
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006714 public Pid getPidStatsLocked(int pid) {
6715 Pid p = mPids.get(pid);
6716 if (p == null) {
6717 p = new Pid();
6718 mPids.put(pid, p);
6719 }
6720 return p;
6721 }
6722
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006723 /**
6724 * Retrieve the statistics object for a particular service, creating
6725 * if needed.
6726 */
6727 public Pkg getPackageStatsLocked(String name) {
6728 Pkg ps = mPackageStats.get(name);
6729 if (ps == null) {
6730 ps = new Pkg();
6731 mPackageStats.put(name, ps);
6732 }
6733
6734 return ps;
6735 }
6736
6737 /**
6738 * Retrieve the statistics object for a particular service, creating
6739 * if needed.
6740 */
6741 public Pkg.Serv getServiceStatsLocked(String pkg, String serv) {
6742 Pkg ps = getPackageStatsLocked(pkg);
6743 Pkg.Serv ss = ps.mServiceStats.get(serv);
6744 if (ss == null) {
6745 ss = ps.newServiceStatsLocked();
6746 ps.mServiceStats.put(serv, ss);
6747 }
6748
6749 return ss;
6750 }
6751
Dianne Hackbornd953c532014-08-16 18:17:38 -07006752 public void readSyncSummaryFromParcelLocked(String name, Parcel in) {
6753 StopwatchTimer timer = mSyncStats.instantiateObject();
6754 timer.readSummaryFromParcelLocked(in);
6755 mSyncStats.add(name, timer);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07006756 }
6757
Dianne Hackbornd953c532014-08-16 18:17:38 -07006758 public void readJobSummaryFromParcelLocked(String name, Parcel in) {
6759 StopwatchTimer timer = mJobStats.instantiateObject();
6760 timer.readSummaryFromParcelLocked(in);
6761 mJobStats.add(name, timer);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07006762 }
6763
Dianne Hackbornd953c532014-08-16 18:17:38 -07006764 public void readWakeSummaryFromParcelLocked(String wlName, Parcel in) {
6765 Wakelock wl = new Wakelock();
6766 mWakelockStats.add(wlName, wl);
6767 if (in.readInt() != 0) {
6768 wl.getStopwatchTimer(WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006769 }
Dianne Hackbornd953c532014-08-16 18:17:38 -07006770 if (in.readInt() != 0) {
6771 wl.getStopwatchTimer(WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
6772 }
6773 if (in.readInt() != 0) {
6774 wl.getStopwatchTimer(WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006775 }
Adam Lesinski9425fe22015-06-19 12:02:13 -07006776 if (in.readInt() != 0) {
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07006777 wl.getStopwatchTimer(WAKE_TYPE_DRAW).readSummaryFromParcelLocked(in);
Adam Lesinski9425fe22015-06-19 12:02:13 -07006778 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006779 }
6780
Evan Millarc64edde2009-04-18 12:26:32 -07006781 public StopwatchTimer getSensorTimerLocked(int sensor, boolean create) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006782 Sensor se = mSensorStats.get(sensor);
6783 if (se == null) {
6784 if (!create) {
6785 return null;
6786 }
6787 se = new Sensor(sensor);
6788 mSensorStats.put(sensor, se);
6789 }
Evan Millarc64edde2009-04-18 12:26:32 -07006790 StopwatchTimer t = se.mTimer;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006791 if (t != null) {
6792 return t;
6793 }
Evan Millarc64edde2009-04-18 12:26:32 -07006794 ArrayList<StopwatchTimer> timers = mSensorTimers.get(sensor);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006795 if (timers == null) {
Evan Millarc64edde2009-04-18 12:26:32 -07006796 timers = new ArrayList<StopwatchTimer>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006797 mSensorTimers.put(sensor, timers);
6798 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006799 t = new StopwatchTimer(Uid.this, BatteryStats.SENSOR, timers, mOnBatteryTimeBase);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006800 se.mTimer = t;
6801 return t;
6802 }
6803
Dianne Hackbornfdb19562014-07-11 16:03:36 -07006804 public void noteStartSyncLocked(String name, long elapsedRealtimeMs) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07006805 StopwatchTimer t = mSyncStats.startObject(name);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07006806 if (t != null) {
6807 t.startRunningLocked(elapsedRealtimeMs);
6808 }
6809 }
6810
6811 public void noteStopSyncLocked(String name, long elapsedRealtimeMs) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07006812 StopwatchTimer t = mSyncStats.stopObject(name);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07006813 if (t != null) {
6814 t.stopRunningLocked(elapsedRealtimeMs);
6815 }
6816 }
6817
6818 public void noteStartJobLocked(String name, long elapsedRealtimeMs) {
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07006819 StopwatchTimer t = mJobStats.startObject(name);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07006820 if (t != null) {
6821 t.startRunningLocked(elapsedRealtimeMs);
6822 }
6823 }
6824
6825 public void noteStopJobLocked(String name, long elapsedRealtimeMs) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07006826 StopwatchTimer t = mJobStats.stopObject(name);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07006827 if (t != null) {
6828 t.stopRunningLocked(elapsedRealtimeMs);
6829 }
6830 }
6831
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006832 public void noteStartWakeLocked(int pid, String name, int type, long elapsedRealtimeMs) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07006833 Wakelock wl = mWakelockStats.startObject(name);
6834 if (wl != null) {
6835 wl.getStopwatchTimer(type).startRunningLocked(elapsedRealtimeMs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006836 }
Dianne Hackborn1ebccf52010-08-15 13:04:34 -07006837 if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006838 Pid p = getPidStatsLocked(pid);
Dianne Hackborne5167ca2014-03-08 14:39:10 -08006839 if (p.mWakeNesting++ == 0) {
6840 p.mWakeStartMs = elapsedRealtimeMs;
Dianne Hackbornb8071d792010-09-09 16:45:15 -07006841 }
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006842 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006843 }
6844
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006845 public void noteStopWakeLocked(int pid, String name, int type, long elapsedRealtimeMs) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07006846 Wakelock wl = mWakelockStats.stopObject(name);
6847 if (wl != null) {
6848 wl.getStopwatchTimer(type).stopRunningLocked(elapsedRealtimeMs);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006849 }
Dianne Hackborn1ebccf52010-08-15 13:04:34 -07006850 if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006851 Pid p = mPids.get(pid);
Dianne Hackborne5167ca2014-03-08 14:39:10 -08006852 if (p != null && p.mWakeNesting > 0) {
6853 if (p.mWakeNesting-- == 1) {
6854 p.mWakeSumMs += elapsedRealtimeMs - p.mWakeStartMs;
6855 p.mWakeStartMs = 0;
6856 }
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07006857 }
6858 }
6859 }
6860
6861 public void reportExcessiveWakeLocked(String proc, long overTime, long usedTime) {
6862 Proc p = getProcessStatsLocked(proc);
6863 if (p != null) {
6864 p.addExcessiveWake(overTime, usedTime);
6865 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006866 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006867
Dianne Hackborn287952c2010-09-22 22:34:31 -07006868 public void reportExcessiveCpuLocked(String proc, long overTime, long usedTime) {
6869 Proc p = getProcessStatsLocked(proc);
6870 if (p != null) {
6871 p.addExcessiveCpu(overTime, usedTime);
6872 }
6873 }
6874
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006875 public void noteStartSensor(int sensor, long elapsedRealtimeMs) {
Evan Millarc64edde2009-04-18 12:26:32 -07006876 StopwatchTimer t = getSensorTimerLocked(sensor, true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006877 if (t != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006878 t.startRunningLocked(elapsedRealtimeMs);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006879 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006880 }
6881
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006882 public void noteStopSensor(int sensor, long elapsedRealtimeMs) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006883 // Don't create a timer if one doesn't already exist
Evan Millarc64edde2009-04-18 12:26:32 -07006884 StopwatchTimer t = getSensorTimerLocked(sensor, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006885 if (t != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006886 t.stopRunningLocked(elapsedRealtimeMs);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006887 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006888 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006889
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006890 public void noteStartGps(long elapsedRealtimeMs) {
Evan Millarc64edde2009-04-18 12:26:32 -07006891 StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006892 if (t != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006893 t.startRunningLocked(elapsedRealtimeMs);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006894 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006895 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07006896
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006897 public void noteStopGps(long elapsedRealtimeMs) {
Evan Millarc64edde2009-04-18 12:26:32 -07006898 StopwatchTimer t = getSensorTimerLocked(Sensor.GPS, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006899 if (t != null) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006900 t.stopRunningLocked(elapsedRealtimeMs);
Amith Yamasani244fa5c2009-05-22 14:36:07 -07006901 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006902 }
6903
6904 public BatteryStatsImpl getBatteryStats() {
6905 return BatteryStatsImpl.this;
6906 }
6907 }
6908
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07006909 public BatteryStatsImpl(File systemDir, Handler handler, ExternalStatsSync externalSync) {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07006910 if (systemDir != null) {
6911 mFile = new JournaledFile(new File(systemDir, "batterystats.bin"),
6912 new File(systemDir, "batterystats.bin.tmp"));
6913 } else {
6914 mFile = null;
6915 }
6916 mCheckinFile = new AtomicFile(new File(systemDir, "batterystats-checkin.bin"));
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08006917 mDailyFile = new AtomicFile(new File(systemDir, "batterystats-daily.xml"));
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07006918 mExternalSync = externalSync;
Jeff Brown6f357d32014-01-15 20:40:55 -08006919 mHandler = new MyHandler(handler.getLooper());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006920 mStartCount++;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006921 mScreenOnTimer = new StopwatchTimer(null, -1, null, mOnBatteryTimeBase);
Dianne Hackborn617f8772009-03-31 15:04:46 -07006922 for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006923 mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mOnBatteryTimeBase);
Dianne Hackborn617f8772009-03-31 15:04:46 -07006924 }
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07006925 mInteractiveTimer = new StopwatchTimer(null, -10, null, mOnBatteryTimeBase);
6926 mPowerSaveModeEnabledTimer = new StopwatchTimer(null, -2, null, mOnBatteryTimeBase);
Dianne Hackborn08c47a52015-10-15 12:38:14 -07006927 mDeviceIdleModeLightTimer = new StopwatchTimer(null, -11, null, mOnBatteryTimeBase);
6928 mDeviceIdleModeFullTimer = new StopwatchTimer(null, -14, null, mOnBatteryTimeBase);
6929 mDeviceLightIdlingTimer = new StopwatchTimer(null, -15, null, mOnBatteryTimeBase);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07006930 mDeviceIdlingTimer = new StopwatchTimer(null, -12, null, mOnBatteryTimeBase);
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07006931 mPhoneOnTimer = new StopwatchTimer(null, -3, null, mOnBatteryTimeBase);
Wink Saville52840902011-02-18 12:40:47 -08006932 for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006933 mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i, null,
6934 mOnBatteryTimeBase);
Dianne Hackborn627bba72009-03-24 22:32:56 -07006935 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006936 mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mOnBatteryTimeBase);
Dianne Hackborn627bba72009-03-24 22:32:56 -07006937 for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006938 mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i, null,
6939 mOnBatteryTimeBase);
Dianne Hackborn627bba72009-03-24 22:32:56 -07006940 }
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07006941 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006942 mNetworkByteActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase);
6943 mNetworkPacketActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07006944 }
Adam Lesinski33dac552015-03-09 15:24:48 -07006945 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
6946 mBluetoothActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase);
6947 mWifiActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase);
6948 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006949 mMobileRadioActiveTimer = new StopwatchTimer(null, -400, null, mOnBatteryTimeBase);
6950 mMobileRadioActivePerAppTimer = new StopwatchTimer(null, -401, null, mOnBatteryTimeBase);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07006951 mMobileRadioActiveAdjustedTime = new LongSamplingCounter(mOnBatteryTimeBase);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006952 mMobileRadioActiveUnknownTime = new LongSamplingCounter(mOnBatteryTimeBase);
6953 mMobileRadioActiveUnknownCount = new LongSamplingCounter(mOnBatteryTimeBase);
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07006954 mWifiOnTimer = new StopwatchTimer(null, -4, null, mOnBatteryTimeBase);
6955 mGlobalWifiRunningTimer = new StopwatchTimer(null, -5, null, mOnBatteryTimeBase);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08006956 for (int i=0; i<NUM_WIFI_STATES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006957 mWifiStateTimer[i] = new StopwatchTimer(null, -600-i, null, mOnBatteryTimeBase);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08006958 }
Dianne Hackborn3251b902014-06-20 14:40:53 -07006959 for (int i=0; i<NUM_WIFI_SUPPL_STATES; i++) {
6960 mWifiSupplStateTimer[i] = new StopwatchTimer(null, -700-i, null, mOnBatteryTimeBase);
6961 }
6962 for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
6963 mWifiSignalStrengthsTimer[i] = new StopwatchTimer(null, -800-i, null,
6964 mOnBatteryTimeBase);
6965 }
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07006966 mAudioOnTimer = new StopwatchTimer(null, -7, null, mOnBatteryTimeBase);
6967 mVideoOnTimer = new StopwatchTimer(null, -8, null, mOnBatteryTimeBase);
Dianne Hackbornabc7c492014-06-30 16:57:46 -07006968 mFlashlightOnTimer = new StopwatchTimer(null, -9, null, mOnBatteryTimeBase);
Ruben Brunk6d2c3632015-05-26 17:32:16 -07006969 mCameraOnTimer = new StopwatchTimer(null, -13, null, mOnBatteryTimeBase);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006970 mOnBattery = mOnBatteryInternal = false;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08006971 long uptime = SystemClock.uptimeMillis() * 1000;
6972 long realtime = SystemClock.elapsedRealtime() * 1000;
6973 initTimes(uptime, realtime);
Dianne Hackborncd0e3352014-08-07 17:08:09 -07006974 mStartPlatformVersion = mEndPlatformVersion = Build.ID;
Evan Millar633a1742009-04-02 16:36:33 -07006975 mDischargeStartLevel = 0;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07006976 mDischargeUnplugLevel = 0;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07006977 mDischargePlugLevel = -1;
Evan Millar633a1742009-04-02 16:36:33 -07006978 mDischargeCurrentLevel = 0;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07006979 mCurrentBatteryLevel = 0;
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08006980 initDischarge();
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07006981 clearHistoryLocked();
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08006982 updateDailyDeadlineLocked();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006983 }
6984
6985 public BatteryStatsImpl(Parcel p) {
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07006986 mFile = null;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07006987 mCheckinFile = null;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08006988 mDailyFile = null;
Dianne Hackborn0d903a82010-09-07 23:51:03 -07006989 mHandler = null;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07006990 mExternalSync = null;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07006991 clearHistoryLocked();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006992 readFromParcel(p);
6993 }
6994
Adam Lesinskie08af192015-03-25 16:42:59 -07006995 public void setPowerProfile(PowerProfile profile) {
6996 synchronized (this) {
6997 mPowerProfile = profile;
Adam Lesinski6832f392015-09-05 18:05:40 -07006998
6999 // We need to initialize the KernelCpuSpeedReaders to read from
7000 // the first cpu of each core. Once we have the PowerProfile, we have access to this
7001 // information.
7002 final int numClusters = mPowerProfile.getNumCpuClusters();
7003 mKernelCpuSpeedReaders = new KernelCpuSpeedReader[numClusters];
7004 int firstCpuOfCluster = 0;
7005 for (int i = 0; i < numClusters; i++) {
7006 final int numSpeedSteps = mPowerProfile.getNumSpeedStepsInCpuCluster(i);
7007 mKernelCpuSpeedReaders[i] = new KernelCpuSpeedReader(firstCpuOfCluster,
7008 numSpeedSteps);
7009 firstCpuOfCluster += mPowerProfile.getNumCoresInCpuCluster(i);
7010 }
Adam Lesinskie08af192015-03-25 16:42:59 -07007011 }
7012 }
7013
Dianne Hackborn0d903a82010-09-07 23:51:03 -07007014 public void setCallback(BatteryCallback cb) {
7015 mCallback = cb;
7016 }
7017
Amith Yamasanif37447b2009-10-08 18:28:01 -07007018 public void setRadioScanningTimeout(long timeout) {
7019 if (mPhoneSignalScanningTimer != null) {
7020 mPhoneSignalScanningTimer.setTimeout(timeout);
7021 }
7022 }
7023
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08007024 public void updateDailyDeadlineLocked() {
7025 // Get the current time.
7026 long currentTime = mDailyStartTime = System.currentTimeMillis();
7027 Calendar calDeadline = Calendar.getInstance();
7028 calDeadline.setTimeInMillis(currentTime);
7029
7030 // Move time up to the next day, ranging from 1am to 3pm.
7031 calDeadline.set(Calendar.DAY_OF_YEAR, calDeadline.get(Calendar.DAY_OF_YEAR) + 1);
7032 calDeadline.set(Calendar.MILLISECOND, 0);
7033 calDeadline.set(Calendar.SECOND, 0);
7034 calDeadline.set(Calendar.MINUTE, 0);
7035 calDeadline.set(Calendar.HOUR_OF_DAY, 1);
7036 mNextMinDailyDeadline = calDeadline.getTimeInMillis();
7037 calDeadline.set(Calendar.HOUR_OF_DAY, 3);
7038 mNextMaxDailyDeadline = calDeadline.getTimeInMillis();
7039 }
7040
7041 public void recordDailyStatsIfNeededLocked(boolean settled) {
7042 long currentTime = System.currentTimeMillis();
7043 if (currentTime >= mNextMaxDailyDeadline) {
7044 recordDailyStatsLocked();
7045 } else if (settled && currentTime >= mNextMinDailyDeadline) {
7046 recordDailyStatsLocked();
7047 } else if (currentTime < (mDailyStartTime-(1000*60*60*24))) {
7048 recordDailyStatsLocked();
7049 }
7050 }
7051
7052 public void recordDailyStatsLocked() {
7053 DailyItem item = new DailyItem();
7054 item.mStartTime = mDailyStartTime;
7055 item.mEndTime = System.currentTimeMillis();
7056 boolean hasData = false;
7057 if (mDailyDischargeStepTracker.mNumStepDurations > 0) {
7058 hasData = true;
7059 item.mDischargeSteps = new LevelStepTracker(
7060 mDailyDischargeStepTracker.mNumStepDurations,
7061 mDailyDischargeStepTracker.mStepDurations);
7062 }
7063 if (mDailyChargeStepTracker.mNumStepDurations > 0) {
7064 hasData = true;
7065 item.mChargeSteps = new LevelStepTracker(
7066 mDailyChargeStepTracker.mNumStepDurations,
7067 mDailyChargeStepTracker.mStepDurations);
7068 }
Dianne Hackborn88e98df2015-03-23 13:29:14 -07007069 if (mDailyPackageChanges != null) {
7070 hasData = true;
7071 item.mPackageChanges = mDailyPackageChanges;
7072 mDailyPackageChanges = null;
7073 }
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08007074 mDailyDischargeStepTracker.init();
7075 mDailyChargeStepTracker.init();
7076 updateDailyDeadlineLocked();
7077
7078 if (hasData) {
7079 mDailyItems.add(item);
7080 while (mDailyItems.size() > MAX_DAILY_ITEMS) {
7081 mDailyItems.remove(0);
7082 }
7083 final ByteArrayOutputStream memStream = new ByteArrayOutputStream();
7084 try {
7085 XmlSerializer out = new FastXmlSerializer();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01007086 out.setOutput(memStream, StandardCharsets.UTF_8.name());
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08007087 writeDailyItemsLocked(out);
7088 BackgroundThread.getHandler().post(new Runnable() {
7089 @Override
7090 public void run() {
7091 synchronized (mCheckinFile) {
7092 FileOutputStream stream = null;
7093 try {
7094 stream = mDailyFile.startWrite();
7095 memStream.writeTo(stream);
7096 stream.flush();
7097 FileUtils.sync(stream);
7098 stream.close();
7099 mDailyFile.finishWrite(stream);
7100 } catch (IOException e) {
7101 Slog.w("BatteryStats",
7102 "Error writing battery daily items", e);
7103 mDailyFile.failWrite(stream);
7104 }
7105 }
7106 }
7107 });
7108 } catch (IOException e) {
7109 }
7110 }
7111 }
7112
7113 private void writeDailyItemsLocked(XmlSerializer out) throws IOException {
7114 StringBuilder sb = new StringBuilder(64);
7115 out.startDocument(null, true);
7116 out.startTag(null, "daily-items");
7117 for (int i=0; i<mDailyItems.size(); i++) {
7118 final DailyItem dit = mDailyItems.get(i);
7119 out.startTag(null, "item");
7120 out.attribute(null, "start", Long.toString(dit.mStartTime));
7121 out.attribute(null, "end", Long.toString(dit.mEndTime));
7122 writeDailyLevelSteps(out, "dis", dit.mDischargeSteps, sb);
7123 writeDailyLevelSteps(out, "chg", dit.mChargeSteps, sb);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07007124 if (dit.mPackageChanges != null) {
7125 for (int j=0; j<dit.mPackageChanges.size(); j++) {
7126 PackageChange pc = dit.mPackageChanges.get(j);
7127 if (pc.mUpdate) {
7128 out.startTag(null, "upd");
7129 out.attribute(null, "pkg", pc.mPackageName);
7130 out.attribute(null, "ver", Integer.toString(pc.mVersionCode));
7131 out.endTag(null, "upd");
7132 } else {
7133 out.startTag(null, "rem");
7134 out.attribute(null, "pkg", pc.mPackageName);
7135 out.endTag(null, "rem");
7136 }
7137 }
7138 }
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08007139 out.endTag(null, "item");
7140 }
7141 out.endTag(null, "daily-items");
7142 out.endDocument();
7143 }
7144
7145 private void writeDailyLevelSteps(XmlSerializer out, String tag, LevelStepTracker steps,
7146 StringBuilder tmpBuilder) throws IOException {
7147 if (steps != null) {
7148 out.startTag(null, tag);
7149 out.attribute(null, "n", Integer.toString(steps.mNumStepDurations));
7150 for (int i=0; i<steps.mNumStepDurations; i++) {
7151 out.startTag(null, "s");
7152 tmpBuilder.setLength(0);
7153 steps.encodeEntryAt(i, tmpBuilder);
7154 out.attribute(null, "v", tmpBuilder.toString());
7155 out.endTag(null, "s");
7156 }
7157 out.endTag(null, tag);
7158 }
7159 }
7160
7161 public void readDailyStatsLocked() {
7162 Slog.d(TAG, "Reading daily items from " + mDailyFile.getBaseFile());
7163 mDailyItems.clear();
7164 FileInputStream stream;
7165 try {
7166 stream = mDailyFile.openRead();
7167 } catch (FileNotFoundException e) {
7168 return;
7169 }
7170 try {
7171 XmlPullParser parser = Xml.newPullParser();
Wojciech Staszkiewicz9e9e2e72015-05-08 14:58:46 +01007172 parser.setInput(stream, StandardCharsets.UTF_8.name());
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08007173 readDailyItemsLocked(parser);
7174 } catch (XmlPullParserException e) {
7175 } finally {
7176 try {
7177 stream.close();
7178 } catch (IOException e) {
7179 }
7180 }
7181 }
7182
7183 private void readDailyItemsLocked(XmlPullParser parser) {
7184 try {
7185 int type;
7186 while ((type = parser.next()) != XmlPullParser.START_TAG
7187 && type != XmlPullParser.END_DOCUMENT) {
7188 ;
7189 }
7190
7191 if (type != XmlPullParser.START_TAG) {
7192 throw new IllegalStateException("no start tag found");
7193 }
7194
7195 int outerDepth = parser.getDepth();
7196 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
7197 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
7198 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
7199 continue;
7200 }
7201
7202 String tagName = parser.getName();
7203 if (tagName.equals("item")) {
7204 readDailyItemTagLocked(parser);
7205 } else {
7206 Slog.w(TAG, "Unknown element under <daily-items>: "
7207 + parser.getName());
7208 XmlUtils.skipCurrentTag(parser);
7209 }
7210 }
7211
7212 } catch (IllegalStateException e) {
7213 Slog.w(TAG, "Failed parsing daily " + e);
7214 } catch (NullPointerException e) {
7215 Slog.w(TAG, "Failed parsing daily " + e);
7216 } catch (NumberFormatException e) {
7217 Slog.w(TAG, "Failed parsing daily " + e);
7218 } catch (XmlPullParserException e) {
7219 Slog.w(TAG, "Failed parsing daily " + e);
7220 } catch (IOException e) {
7221 Slog.w(TAG, "Failed parsing daily " + e);
7222 } catch (IndexOutOfBoundsException e) {
7223 Slog.w(TAG, "Failed parsing daily " + e);
7224 }
7225 }
7226
7227 void readDailyItemTagLocked(XmlPullParser parser) throws NumberFormatException,
7228 XmlPullParserException, IOException {
7229 DailyItem dit = new DailyItem();
7230 String attr = parser.getAttributeValue(null, "start");
7231 if (attr != null) {
7232 dit.mStartTime = Long.parseLong(attr);
7233 }
7234 attr = parser.getAttributeValue(null, "end");
7235 if (attr != null) {
7236 dit.mEndTime = Long.parseLong(attr);
7237 }
7238 int outerDepth = parser.getDepth();
7239 int type;
7240 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
7241 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
7242 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
7243 continue;
7244 }
7245
7246 String tagName = parser.getName();
7247 if (tagName.equals("dis")) {
7248 readDailyItemTagDetailsLocked(parser, dit, false, "dis");
7249 } else if (tagName.equals("chg")) {
7250 readDailyItemTagDetailsLocked(parser, dit, true, "chg");
Dianne Hackborn88e98df2015-03-23 13:29:14 -07007251 } else if (tagName.equals("upd")) {
7252 if (dit.mPackageChanges == null) {
7253 dit.mPackageChanges = new ArrayList<>();
7254 }
7255 PackageChange pc = new PackageChange();
7256 pc.mUpdate = true;
7257 pc.mPackageName = parser.getAttributeValue(null, "pkg");
7258 String verStr = parser.getAttributeValue(null, "ver");
7259 pc.mVersionCode = verStr != null ? Integer.parseInt(verStr) : 0;
7260 dit.mPackageChanges.add(pc);
7261 XmlUtils.skipCurrentTag(parser);
7262 } else if (tagName.equals("rem")) {
7263 if (dit.mPackageChanges == null) {
7264 dit.mPackageChanges = new ArrayList<>();
7265 }
7266 PackageChange pc = new PackageChange();
7267 pc.mUpdate = false;
7268 pc.mPackageName = parser.getAttributeValue(null, "pkg");
7269 dit.mPackageChanges.add(pc);
7270 XmlUtils.skipCurrentTag(parser);
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08007271 } else {
7272 Slog.w(TAG, "Unknown element under <item>: "
7273 + parser.getName());
7274 XmlUtils.skipCurrentTag(parser);
7275 }
7276 }
7277 mDailyItems.add(dit);
7278 }
7279
7280 void readDailyItemTagDetailsLocked(XmlPullParser parser, DailyItem dit, boolean isCharge,
7281 String tag)
7282 throws NumberFormatException, XmlPullParserException, IOException {
7283 final String numAttr = parser.getAttributeValue(null, "n");
7284 if (numAttr == null) {
7285 Slog.w(TAG, "Missing 'n' attribute at " + parser.getPositionDescription());
7286 XmlUtils.skipCurrentTag(parser);
7287 return;
7288 }
7289 final int num = Integer.parseInt(numAttr);
7290 LevelStepTracker steps = new LevelStepTracker(num);
7291 if (isCharge) {
7292 dit.mChargeSteps = steps;
7293 } else {
7294 dit.mDischargeSteps = steps;
7295 }
7296 int i = 0;
7297 int outerDepth = parser.getDepth();
7298 int type;
7299 while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
7300 && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) {
7301 if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) {
7302 continue;
7303 }
7304
7305 String tagName = parser.getName();
7306 if ("s".equals(tagName)) {
7307 if (i < num) {
7308 String valueAttr = parser.getAttributeValue(null, "v");
7309 if (valueAttr != null) {
7310 steps.decodeEntryAt(i, valueAttr);
7311 i++;
7312 }
7313 }
7314 } else {
7315 Slog.w(TAG, "Unknown element under <" + tag + ">: "
7316 + parser.getName());
7317 XmlUtils.skipCurrentTag(parser);
7318 }
7319 }
7320 steps.mNumStepDurations = i;
7321 }
7322
7323 @Override
7324 public DailyItem getDailyItemLocked(int daysAgo) {
7325 int index = mDailyItems.size()-1-daysAgo;
7326 return index >= 0 ? mDailyItems.get(index) : null;
7327 }
7328
7329 @Override
7330 public long getCurrentDailyStartTime() {
7331 return mDailyStartTime;
7332 }
7333
7334 @Override
7335 public long getNextMinDailyDeadline() {
7336 return mNextMinDailyDeadline;
7337 }
7338
7339 @Override
7340 public long getNextMaxDailyDeadline() {
7341 return mNextMaxDailyDeadline;
7342 }
7343
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007344 @Override
7345 public boolean startIteratingOldHistoryLocked() {
7346 if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
7347 + " pos=" + mHistoryBuffer.dataPosition());
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08007348 if ((mHistoryIterator = mHistory) == null) {
7349 return false;
7350 }
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007351 mHistoryBuffer.setDataPosition(0);
Dianne Hackborn1fadab52011-04-14 17:57:33 -07007352 mHistoryReadTmp.clear();
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007353 mReadOverflow = false;
7354 mIteratingHistory = true;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08007355 return true;
Dianne Hackbornce2ef762010-09-20 11:39:14 -07007356 }
7357
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007358 @Override
7359 public boolean getNextOldHistoryLocked(HistoryItem out) {
7360 boolean end = mHistoryBuffer.dataPosition() >= mHistoryBuffer.dataSize();
7361 if (!end) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08007362 readHistoryDelta(mHistoryBuffer, mHistoryReadTmp);
Dianne Hackborn1fadab52011-04-14 17:57:33 -07007363 mReadOverflow |= mHistoryReadTmp.cmd == HistoryItem.CMD_OVERFLOW;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007364 }
Dianne Hackbornce2ef762010-09-20 11:39:14 -07007365 HistoryItem cur = mHistoryIterator;
7366 if (cur == null) {
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007367 if (!mReadOverflow && !end) {
7368 Slog.w(TAG, "Old history ends before new history!");
7369 }
Dianne Hackbornce2ef762010-09-20 11:39:14 -07007370 return false;
7371 }
7372 out.setTo(cur);
7373 mHistoryIterator = cur.next;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007374 if (!mReadOverflow) {
7375 if (end) {
7376 Slog.w(TAG, "New history ends before old history!");
Dianne Hackborn1fadab52011-04-14 17:57:33 -07007377 } else if (!out.same(mHistoryReadTmp)) {
Dianne Hackborn8c841092013-06-24 13:46:13 -07007378 PrintWriter pw = new FastPrintWriter(new LogWriter(android.util.Log.WARN, TAG));
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007379 pw.println("Histories differ!");
7380 pw.println("Old history:");
Dianne Hackborn99009ea2014-04-18 16:23:42 -07007381 (new HistoryPrinter()).printNextItem(pw, out, 0, false, true);
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007382 pw.println("New history:");
Dianne Hackborn99009ea2014-04-18 16:23:42 -07007383 (new HistoryPrinter()).printNextItem(pw, mHistoryReadTmp, 0, false,
7384 true);
Dianne Hackborn8c841092013-06-24 13:46:13 -07007385 pw.flush();
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007386 }
7387 }
Dianne Hackbornce2ef762010-09-20 11:39:14 -07007388 return true;
7389 }
7390
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08007391 @Override
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007392 public void finishIteratingOldHistoryLocked() {
7393 mIteratingHistory = false;
7394 mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08007395 mHistoryIterator = null;
7396 }
7397
7398 public int getHistoryTotalSize() {
7399 return MAX_HISTORY_BUFFER;
7400 }
7401
7402 public int getHistoryUsedSize() {
7403 return mHistoryBuffer.dataSize();
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007404 }
7405
7406 @Override
7407 public boolean startIteratingHistoryLocked() {
7408 if (DEBUG_HISTORY) Slog.i(TAG, "ITERATING: buff size=" + mHistoryBuffer.dataSize()
7409 + " pos=" + mHistoryBuffer.dataPosition());
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08007410 if (mHistoryBuffer.dataSize() <= 0) {
7411 return false;
7412 }
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007413 mHistoryBuffer.setDataPosition(0);
7414 mReadOverflow = false;
7415 mIteratingHistory = true;
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08007416 mReadHistoryStrings = new String[mHistoryTagPool.size()];
7417 mReadHistoryUids = new int[mHistoryTagPool.size()];
7418 mReadHistoryChars = 0;
7419 for (HashMap.Entry<HistoryTag, Integer> ent : mHistoryTagPool.entrySet()) {
7420 final HistoryTag tag = ent.getKey();
7421 final int idx = ent.getValue();
7422 mReadHistoryStrings[idx] = tag.string;
7423 mReadHistoryUids[idx] = tag.uid;
7424 mReadHistoryChars += tag.string.length() + 1;
Dianne Hackborn099bc622014-01-22 13:39:16 -08007425 }
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08007426 return true;
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007427 }
7428
7429 @Override
Dianne Hackborn099bc622014-01-22 13:39:16 -08007430 public int getHistoryStringPoolSize() {
7431 return mReadHistoryStrings.length;
7432 }
7433
7434 @Override
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08007435 public int getHistoryStringPoolBytes() {
7436 // Each entry is a fixed 12 bytes: 4 for index, 4 for uid, 4 for string size
7437 // Each string character is 2 bytes.
7438 return (mReadHistoryStrings.length * 12) + (mReadHistoryChars * 2);
7439 }
7440
7441 @Override
7442 public String getHistoryTagPoolString(int index) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08007443 return mReadHistoryStrings[index];
7444 }
7445
7446 @Override
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08007447 public int getHistoryTagPoolUid(int index) {
7448 return mReadHistoryUids[index];
7449 }
7450
7451 @Override
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007452 public boolean getNextHistoryLocked(HistoryItem out) {
Dianne Hackborn1fadab52011-04-14 17:57:33 -07007453 final int pos = mHistoryBuffer.dataPosition();
7454 if (pos == 0) {
7455 out.clear();
7456 }
7457 boolean end = pos >= mHistoryBuffer.dataSize();
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007458 if (end) {
7459 return false;
7460 }
7461
Dianne Hackborn99009ea2014-04-18 16:23:42 -07007462 final long lastRealtime = out.time;
7463 final long lastWalltime = out.currentTime;
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08007464 readHistoryDelta(mHistoryBuffer, out);
Dianne Hackborn37de0982014-05-09 09:32:18 -07007465 if (out.cmd != HistoryItem.CMD_CURRENT_TIME
7466 && out.cmd != HistoryItem.CMD_RESET && lastWalltime != 0) {
Dianne Hackborn99009ea2014-04-18 16:23:42 -07007467 out.currentTime = lastWalltime + (out.time - lastRealtime);
7468 }
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07007469 return true;
7470 }
7471
7472 @Override
7473 public void finishIteratingHistoryLocked() {
7474 mIteratingHistory = false;
7475 mHistoryBuffer.setDataPosition(mHistoryBuffer.dataSize());
Dianne Hackborn099bc622014-01-22 13:39:16 -08007476 mReadHistoryStrings = null;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07007477 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07007478
Dianne Hackborn32907cf2010-06-10 17:50:20 -07007479 @Override
Dianne Hackbornb5e31652010-09-07 12:13:55 -07007480 public long getHistoryBaseTime() {
7481 return mHistoryBaseTime;
7482 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07007483
Dianne Hackbornb5e31652010-09-07 12:13:55 -07007484 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08007485 public int getStartCount() {
7486 return mStartCount;
7487 }
7488
7489 public boolean isOnBattery() {
7490 return mOnBattery;
7491 }
7492
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07007493 public boolean isCharging() {
7494 return mCharging;
7495 }
7496
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07007497 public boolean isScreenOn() {
Jeff Browne95c3cd2014-05-02 16:59:26 -07007498 return mScreenState == Display.STATE_ON;
Dianne Hackborn9adb9c32010-08-13 14:09:56 -07007499 }
7500
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007501 void initTimes(long uptime, long realtime) {
Dianne Hackborn5f4a5f92014-01-24 16:59:34 -08007502 mStartClockTime = System.currentTimeMillis();
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007503 mOnBatteryTimeBase.init(uptime, realtime);
7504 mOnBatteryScreenOffTimeBase.init(uptime, realtime);
Dianne Hackborn4590e522014-03-24 13:36:46 -07007505 mRealtime = 0;
7506 mUptime = 0;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007507 mRealtimeStart = realtime;
Dianne Hackborn4590e522014-03-24 13:36:46 -07007508 mUptimeStart = uptime;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007509 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07007510
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08007511 void initDischarge() {
7512 mLowDischargeAmountSinceCharge = 0;
7513 mHighDischargeAmountSinceCharge = 0;
7514 mDischargeAmountScreenOn = 0;
7515 mDischargeAmountScreenOnSinceCharge = 0;
7516 mDischargeAmountScreenOff = 0;
7517 mDischargeAmountScreenOffSinceCharge = 0;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08007518 mDischargeStepTracker.init();
7519 mChargeStepTracker.init();
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08007520 }
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08007521
7522 public void resetAllStatsCmdLocked() {
7523 resetAllStatsLocked();
Dianne Hackborn40c87252014-03-19 16:55:40 -07007524 final long mSecUptime = SystemClock.uptimeMillis();
7525 long uptime = mSecUptime * 1000;
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08007526 long mSecRealtime = SystemClock.elapsedRealtime();
7527 long realtime = mSecRealtime * 1000;
7528 mDischargeStartLevel = mHistoryCur.batteryLevel;
7529 pullPendingStateUpdatesLocked();
Dianne Hackborn40c87252014-03-19 16:55:40 -07007530 addHistoryRecordLocked(mSecRealtime, mSecUptime);
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07007531 mDischargeCurrentLevel = mDischargeUnplugLevel = mDischargePlugLevel
7532 = mCurrentBatteryLevel = mHistoryCur.batteryLevel;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007533 mOnBatteryTimeBase.reset(uptime, realtime);
7534 mOnBatteryScreenOffTimeBase.reset(uptime, realtime);
7535 if ((mHistoryCur.states&HistoryItem.STATE_BATTERY_PLUGGED_FLAG) == 0) {
Jeff Browne95c3cd2014-05-02 16:59:26 -07007536 if (mScreenState == Display.STATE_ON) {
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08007537 mDischargeScreenOnUnplugLevel = mHistoryCur.batteryLevel;
7538 mDischargeScreenOffUnplugLevel = 0;
7539 } else {
7540 mDischargeScreenOnUnplugLevel = 0;
7541 mDischargeScreenOffUnplugLevel = mHistoryCur.batteryLevel;
7542 }
7543 mDischargeAmountScreenOn = 0;
7544 mDischargeAmountScreenOff = 0;
7545 }
Dianne Hackborn40c87252014-03-19 16:55:40 -07007546 initActiveHistoryEventsLocked(mSecRealtime, mSecUptime);
Dianne Hackborn3d658bf2014-02-05 13:38:56 -08007547 }
7548
7549 private void resetAllStatsLocked() {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007550 mStartCount = 0;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007551 initTimes(SystemClock.uptimeMillis() * 1000, SystemClock.elapsedRealtime() * 1000);
7552 mScreenOnTimer.reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007553 for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007554 mScreenBrightnessTimer[i].reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007555 }
Jeff Browne95c3cd2014-05-02 16:59:26 -07007556 mInteractiveTimer.reset(false);
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07007557 mPowerSaveModeEnabledTimer.reset(false);
Dianne Hackborn08c47a52015-10-15 12:38:14 -07007558 mLongestLightIdleTime = 0;
7559 mLongestFullIdleTime = 0;
7560 mDeviceIdleModeLightTimer.reset(false);
7561 mDeviceIdleModeFullTimer.reset(false);
7562 mDeviceLightIdlingTimer.reset(false);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07007563 mDeviceIdlingTimer.reset(false);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007564 mPhoneOnTimer.reset(false);
7565 mAudioOnTimer.reset(false);
7566 mVideoOnTimer.reset(false);
Dianne Hackbornabc7c492014-06-30 16:57:46 -07007567 mFlashlightOnTimer.reset(false);
Ruben Brunk6d2c3632015-05-26 17:32:16 -07007568 mCameraOnTimer.reset(false);
Wink Saville52840902011-02-18 12:40:47 -08007569 for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007570 mPhoneSignalStrengthsTimer[i].reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007571 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007572 mPhoneSignalScanningTimer.reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007573 for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007574 mPhoneDataConnectionsTimer[i].reset(false);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007575 }
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07007576 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08007577 mNetworkByteActivityCounters[i].reset(false);
7578 mNetworkPacketActivityCounters[i].reset(false);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07007579 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007580 mMobileRadioActiveTimer.reset(false);
7581 mMobileRadioActivePerAppTimer.reset(false);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07007582 mMobileRadioActiveAdjustedTime.reset(false);
Dianne Hackbornd45665b2014-02-26 12:35:32 -08007583 mMobileRadioActiveUnknownTime.reset(false);
7584 mMobileRadioActiveUnknownCount.reset(false);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007585 mWifiOnTimer.reset(false);
7586 mGlobalWifiRunningTimer.reset(false);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08007587 for (int i=0; i<NUM_WIFI_STATES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007588 mWifiStateTimer[i].reset(false);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08007589 }
Dianne Hackborn3251b902014-06-20 14:40:53 -07007590 for (int i=0; i<NUM_WIFI_SUPPL_STATES; i++) {
7591 mWifiSupplStateTimer[i].reset(false);
7592 }
7593 for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
7594 mWifiSignalStrengthsTimer[i].reset(false);
7595 }
Adam Lesinski33dac552015-03-09 15:24:48 -07007596 for (int i=0; i< NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
7597 mBluetoothActivityCounters[i].reset(false);
7598 mWifiActivityCounters[i].reset(false);
7599 }
Dianne Hackborn1e01d162014-12-04 17:46:42 -08007600 mNumConnectivityChange = mLoadedNumConnectivityChange = mUnpluggedNumConnectivityChange = 0;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07007601
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007602 for (int i=0; i<mUidStats.size(); i++) {
7603 if (mUidStats.valueAt(i).reset()) {
7604 mUidStats.remove(mUidStats.keyAt(i));
7605 i--;
7606 }
7607 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07007608
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007609 if (mKernelWakelockStats.size() > 0) {
7610 for (SamplingTimer timer : mKernelWakelockStats.values()) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08007611 mOnBatteryScreenOffTimeBase.remove(timer);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007612 }
7613 mKernelWakelockStats.clear();
7614 }
Dianne Hackborna1bd7922014-03-21 11:07:11 -07007615
7616 if (mWakeupReasonStats.size() > 0) {
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07007617 for (SamplingTimer timer : mWakeupReasonStats.values()) {
7618 mOnBatteryTimeBase.remove(timer);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07007619 }
7620 mWakeupReasonStats.clear();
7621 }
7622
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08007623 mLastHistoryStepDetails = null;
7624 mLastStepCpuUserTime = mLastStepCpuSystemTime = 0;
7625 mCurStepCpuUserTime = mCurStepCpuSystemTime = 0;
7626 mLastStepCpuUserTime = mCurStepCpuUserTime = 0;
7627 mLastStepCpuSystemTime = mCurStepCpuSystemTime = 0;
7628 mLastStepStatUserTime = mCurStepStatUserTime = 0;
7629 mLastStepStatSystemTime = mCurStepStatSystemTime = 0;
7630 mLastStepStatIOWaitTime = mCurStepStatIOWaitTime = 0;
7631 mLastStepStatIrqTime = mCurStepStatIrqTime = 0;
7632 mLastStepStatSoftIrqTime = mCurStepStatSoftIrqTime = 0;
7633 mLastStepStatIdleTime = mCurStepStatIdleTime = 0;
7634
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08007635 initDischarge();
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07007636
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07007637 clearHistoryLocked();
7638 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07007639
Dianne Hackborn40c87252014-03-19 16:55:40 -07007640 private void initActiveHistoryEventsLocked(long elapsedRealtimeMs, long uptimeMs) {
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08007641 for (int i=0; i<HistoryItem.EVENT_COUNT; i++) {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07007642 if (!mRecordAllHistory && i == HistoryItem.EVENT_PROC) {
7643 // Not recording process starts/stops.
7644 continue;
7645 }
Dianne Hackborn37de0982014-05-09 09:32:18 -07007646 HashMap<String, SparseIntArray> active = mActiveEvents.getStateForEvent(i);
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08007647 if (active == null) {
7648 continue;
7649 }
Dianne Hackborn37de0982014-05-09 09:32:18 -07007650 for (HashMap.Entry<String, SparseIntArray> ent : active.entrySet()) {
7651 SparseIntArray uids = ent.getValue();
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08007652 for (int j=0; j<uids.size(); j++) {
Dianne Hackborn37de0982014-05-09 09:32:18 -07007653 addHistoryEventLocked(elapsedRealtimeMs, uptimeMs, i, ent.getKey(),
7654 uids.keyAt(j));
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08007655 }
7656 }
7657 }
7658 }
7659
Dianne Hackborn32de2f62011-03-09 14:03:35 -08007660 void updateDischargeScreenLevelsLocked(boolean oldScreenOn, boolean newScreenOn) {
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08007661 if (oldScreenOn) {
7662 int diff = mDischargeScreenOnUnplugLevel - mDischargeCurrentLevel;
7663 if (diff > 0) {
7664 mDischargeAmountScreenOn += diff;
7665 mDischargeAmountScreenOnSinceCharge += diff;
7666 }
7667 } else {
7668 int diff = mDischargeScreenOffUnplugLevel - mDischargeCurrentLevel;
7669 if (diff > 0) {
7670 mDischargeAmountScreenOff += diff;
7671 mDischargeAmountScreenOffSinceCharge += diff;
7672 }
7673 }
7674 if (newScreenOn) {
7675 mDischargeScreenOnUnplugLevel = mDischargeCurrentLevel;
7676 mDischargeScreenOffUnplugLevel = 0;
7677 } else {
7678 mDischargeScreenOnUnplugLevel = 0;
7679 mDischargeScreenOffUnplugLevel = mDischargeCurrentLevel;
7680 }
7681 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007682
Dianne Hackborna7c837f2014-01-15 16:20:44 -08007683 public void pullPendingStateUpdatesLocked() {
Dianne Hackborn77b987f2014-02-26 16:20:52 -08007684 if (mOnBatteryInternal) {
Jeff Browne95c3cd2014-05-02 16:59:26 -07007685 final boolean screenOn = mScreenState == Display.STATE_ON;
7686 updateDischargeScreenLevelsLocked(screenOn, screenOn);
Dianne Hackborn77b987f2014-02-26 16:20:52 -08007687 }
Dianne Hackborna7c837f2014-01-15 16:20:44 -08007688 }
7689
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007690 private String[] mMobileIfaces = EmptyArray.STRING;
7691 private String[] mWifiIfaces = EmptyArray.STRING;
7692
7693 private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory();
7694
7695 private static final int NETWORK_STATS_LAST = 0;
7696 private static final int NETWORK_STATS_NEXT = 1;
7697 private static final int NETWORK_STATS_DELTA = 2;
7698
7699 private final NetworkStats[] mMobileNetworkStats = new NetworkStats[] {
7700 new NetworkStats(SystemClock.elapsedRealtime(), 50),
7701 new NetworkStats(SystemClock.elapsedRealtime(), 50),
7702 new NetworkStats(SystemClock.elapsedRealtime(), 50)
7703 };
7704
7705 private final NetworkStats[] mWifiNetworkStats = new NetworkStats[] {
7706 new NetworkStats(SystemClock.elapsedRealtime(), 50),
7707 new NetworkStats(SystemClock.elapsedRealtime(), 50),
7708 new NetworkStats(SystemClock.elapsedRealtime(), 50)
7709 };
7710
7711 /**
7712 * Retrieves the delta of network stats for the given network ifaces. Uses networkStatsBuffer
7713 * as a buffer of NetworkStats objects to cycle through when computing deltas.
7714 */
7715 private NetworkStats getNetworkStatsDeltaLocked(String[] ifaces,
7716 NetworkStats[] networkStatsBuffer)
7717 throws IOException {
7718 if (!SystemProperties.getBoolean(NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED,
7719 false)) {
7720 return null;
7721 }
7722
7723 final NetworkStats stats = mNetworkStatsFactory.readNetworkStatsDetail(NetworkStats.UID_ALL,
7724 ifaces, NetworkStats.TAG_NONE, networkStatsBuffer[NETWORK_STATS_NEXT]);
7725 networkStatsBuffer[NETWORK_STATS_DELTA] = NetworkStats.subtract(stats,
7726 networkStatsBuffer[NETWORK_STATS_LAST], null, null,
7727 networkStatsBuffer[NETWORK_STATS_DELTA]);
7728 networkStatsBuffer[NETWORK_STATS_NEXT] = networkStatsBuffer[NETWORK_STATS_LAST];
7729 networkStatsBuffer[NETWORK_STATS_LAST] = stats;
7730 return networkStatsBuffer[NETWORK_STATS_DELTA];
7731 }
7732
7733 /**
7734 * Distribute WiFi energy info and network traffic to apps.
7735 * @param info The energy information from the WiFi controller.
7736 */
7737 public void updateWifiStateLocked(@Nullable final WifiActivityEnergyInfo info) {
Adam Lesinskia7c90c82015-06-18 14:52:24 -07007738 if (DEBUG_ENERGY) {
7739 Slog.d(TAG, "Updating wifi stats");
7740 }
7741
Adam Lesinskie08af192015-03-25 16:42:59 -07007742 final long elapsedRealtimeMs = SystemClock.elapsedRealtime();
7743 NetworkStats delta = null;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007744 try {
Adam Lesinskie08af192015-03-25 16:42:59 -07007745 if (!ArrayUtils.isEmpty(mWifiIfaces)) {
7746 delta = getNetworkStatsDeltaLocked(mWifiIfaces, mWifiNetworkStats);
7747 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007748 } catch (IOException e) {
7749 Slog.wtf(TAG, "Failed to get wifi network stats", e);
7750 return;
7751 }
7752
7753 if (!mOnBatteryInternal) {
7754 return;
7755 }
7756
Adam Lesinskie08af192015-03-25 16:42:59 -07007757 SparseLongArray rxPackets = new SparseLongArray();
7758 SparseLongArray txPackets = new SparseLongArray();
7759 long totalTxPackets = 0;
7760 long totalRxPackets = 0;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007761 if (delta != null) {
7762 final int size = delta.size();
7763 for (int i = 0; i < size; i++) {
7764 final NetworkStats.Entry entry = delta.getValues(i, mTmpNetworkStatsEntry);
7765
Adam Lesinskie08af192015-03-25 16:42:59 -07007766 if (DEBUG_ENERGY) {
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007767 Slog.d(TAG, "Wifi uid " + entry.uid + ": delta rx=" + entry.rxBytes
Adam Lesinskie08af192015-03-25 16:42:59 -07007768 + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets
7769 + " txPackets=" + entry.txPackets);
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007770 }
7771
7772 if (entry.rxBytes == 0 || entry.txBytes == 0) {
7773 continue;
7774 }
7775
7776 final Uid u = getUidStatsLocked(mapUid(entry.uid));
7777 u.noteNetworkActivityLocked(NETWORK_WIFI_RX_DATA, entry.rxBytes,
7778 entry.rxPackets);
7779 u.noteNetworkActivityLocked(NETWORK_WIFI_TX_DATA, entry.txBytes,
7780 entry.txPackets);
Adam Lesinskie08af192015-03-25 16:42:59 -07007781 rxPackets.put(u.getUid(), entry.rxPackets);
7782 txPackets.put(u.getUid(), entry.txPackets);
7783
7784 // Sum the total number of packets so that the Rx Power and Tx Power can
7785 // be evenly distributed amongst the apps.
7786 totalRxPackets += entry.rxPackets;
7787 totalTxPackets += entry.txPackets;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007788
7789 mNetworkByteActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked(
7790 entry.rxBytes);
7791 mNetworkByteActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked(
7792 entry.txBytes);
7793 mNetworkPacketActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked(
7794 entry.rxPackets);
7795 mNetworkPacketActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked(
7796 entry.txPackets);
7797 }
7798 }
7799
7800 if (info != null) {
Adam Lesinski17390762015-04-10 13:17:47 -07007801 mHasWifiEnergyReporting = true;
7802
Adam Lesinskie08af192015-03-25 16:42:59 -07007803 // Measured in mAms
7804 final long txTimeMs = info.getControllerTxTimeMillis();
7805 final long rxTimeMs = info.getControllerRxTimeMillis();
7806 final long idleTimeMs = info.getControllerIdleTimeMillis();
7807 final long totalTimeMs = txTimeMs + rxTimeMs + idleTimeMs;
7808
7809 long leftOverRxTimeMs = rxTimeMs;
Mitchell Willsf9016492015-07-29 17:47:44 -07007810 long leftOverTxTimeMs = txTimeMs;
Adam Lesinskie08af192015-03-25 16:42:59 -07007811
7812 if (DEBUG_ENERGY) {
7813 Slog.d(TAG, "------ BEGIN WiFi power blaming ------");
7814 Slog.d(TAG, " Tx Time: " + txTimeMs + " ms");
7815 Slog.d(TAG, " Rx Time: " + rxTimeMs + " ms");
7816 Slog.d(TAG, " Idle Time: " + idleTimeMs + " ms");
7817 Slog.d(TAG, " Total Time: " + totalTimeMs + " ms");
7818 }
7819
7820 long totalWifiLockTimeMs = 0;
7821 long totalScanTimeMs = 0;
7822
7823 // On the first pass, collect some totals so that we can normalize power
7824 // calculations if we need to.
7825 final int uidStatsSize = mUidStats.size();
7826 for (int i = 0; i < uidStatsSize; i++) {
7827 final Uid uid = mUidStats.valueAt(i);
7828
7829 // Sum the total scan power for all apps.
7830 totalScanTimeMs += uid.mWifiScanTimer.getTimeSinceMarkLocked(
7831 elapsedRealtimeMs * 1000) / 1000;
7832
7833 // Sum the total time holding wifi lock for all apps.
7834 totalWifiLockTimeMs += uid.mFullWifiLockTimer.getTimeSinceMarkLocked(
7835 elapsedRealtimeMs * 1000) / 1000;
7836 }
7837
7838 if (DEBUG_ENERGY && totalScanTimeMs > rxTimeMs) {
7839 Slog.d(TAG, " !Estimated scan time > Actual rx time (" + totalScanTimeMs + " ms > "
7840 + rxTimeMs + " ms). Normalizing scan time.");
7841 }
Mitchell Willsf9016492015-07-29 17:47:44 -07007842 if (DEBUG_ENERGY && totalScanTimeMs > txTimeMs) {
7843 Slog.d(TAG, " !Estimated scan time > Actual tx time (" + totalScanTimeMs + " ms > "
7844 + txTimeMs + " ms). Normalizing scan time.");
7845 }
Adam Lesinskie08af192015-03-25 16:42:59 -07007846
7847 // Actually assign and distribute power usage to apps.
7848 for (int i = 0; i < uidStatsSize; i++) {
7849 final Uid uid = mUidStats.valueAt(i);
7850
7851 long scanTimeSinceMarkMs = uid.mWifiScanTimer.getTimeSinceMarkLocked(
7852 elapsedRealtimeMs * 1000) / 1000;
7853 if (scanTimeSinceMarkMs > 0) {
7854 // Set the new mark so that next time we get new data since this point.
7855 uid.mWifiScanTimer.setMark(elapsedRealtimeMs);
7856
Mitchell Willsf9016492015-07-29 17:47:44 -07007857 long scanRxTimeSinceMarkMs = scanTimeSinceMarkMs;
7858 long scanTxTimeSinceMarkMs = scanTimeSinceMarkMs;
7859
7860 // Our total scan time is more than the reported Tx/Rx time.
7861 // This is possible because the cost of a scan is approximate.
7862 // Let's normalize the result so that we evenly blame each app
7863 // scanning.
7864 //
7865 // This means that we may have apps that transmitted/received packets not be
7866 // blamed for this, but this is fine as scans are relatively more expensive.
Adam Lesinskie08af192015-03-25 16:42:59 -07007867 if (totalScanTimeMs > rxTimeMs) {
Mitchell Willsf9016492015-07-29 17:47:44 -07007868 scanRxTimeSinceMarkMs = (rxTimeMs * scanRxTimeSinceMarkMs) /
7869 totalScanTimeMs;
7870 }
7871 if (totalScanTimeMs > txTimeMs) {
7872 scanTxTimeSinceMarkMs = (txTimeMs * scanTxTimeSinceMarkMs) /
7873 totalScanTimeMs;
Adam Lesinskie08af192015-03-25 16:42:59 -07007874 }
7875
7876 if (DEBUG_ENERGY) {
Mitchell Willsf9016492015-07-29 17:47:44 -07007877 Slog.d(TAG, " ScanTime for UID " + uid.getUid() + ": Rx:"
7878 + scanRxTimeSinceMarkMs + " ms Tx:"
7879 + scanTxTimeSinceMarkMs + " ms)");
Adam Lesinskie08af192015-03-25 16:42:59 -07007880 }
Mitchell Willsf9016492015-07-29 17:47:44 -07007881 uid.noteWifiControllerActivityLocked(CONTROLLER_RX_TIME, scanRxTimeSinceMarkMs);
7882 uid.noteWifiControllerActivityLocked(CONTROLLER_TX_TIME, scanTxTimeSinceMarkMs);
7883 leftOverRxTimeMs -= scanRxTimeSinceMarkMs;
7884 leftOverTxTimeMs -= scanTxTimeSinceMarkMs;
Adam Lesinskie08af192015-03-25 16:42:59 -07007885 }
7886
7887 // Distribute evenly the power consumed while Idle to each app holding a WiFi
7888 // lock.
7889 final long wifiLockTimeSinceMarkMs = uid.mFullWifiLockTimer.getTimeSinceMarkLocked(
7890 elapsedRealtimeMs * 1000) / 1000;
7891 if (wifiLockTimeSinceMarkMs > 0) {
7892 // Set the new mark so that next time we get new data since this point.
7893 uid.mFullWifiLockTimer.setMark(elapsedRealtimeMs);
7894
7895 final long myIdleTimeMs = (wifiLockTimeSinceMarkMs * idleTimeMs)
7896 / totalWifiLockTimeMs;
7897 if (DEBUG_ENERGY) {
7898 Slog.d(TAG, " IdleTime for UID " + uid.getUid() + ": "
7899 + myIdleTimeMs + " ms");
7900 }
7901 uid.noteWifiControllerActivityLocked(CONTROLLER_IDLE_TIME, myIdleTimeMs);
7902 }
7903 }
7904
7905 if (DEBUG_ENERGY) {
7906 Slog.d(TAG, " New RxPower: " + leftOverRxTimeMs + " ms");
Mitchell Willsf9016492015-07-29 17:47:44 -07007907 Slog.d(TAG, " New TxPower: " + leftOverTxTimeMs + " ms");
Adam Lesinskie08af192015-03-25 16:42:59 -07007908 }
7909
Mitchell Willsf9016492015-07-29 17:47:44 -07007910 // Distribute the remaining Tx power appropriately between all apps that transmitted
7911 // packets.
Adam Lesinskie08af192015-03-25 16:42:59 -07007912 for (int i = 0; i < txPackets.size(); i++) {
7913 final Uid uid = getUidStatsLocked(txPackets.keyAt(i));
Mitchell Willsf9016492015-07-29 17:47:44 -07007914 final long myTxTimeMs = (txPackets.valueAt(i) * leftOverTxTimeMs) / totalTxPackets;
Adam Lesinskie08af192015-03-25 16:42:59 -07007915 if (DEBUG_ENERGY) {
7916 Slog.d(TAG, " TxTime for UID " + uid.getUid() + ": " + myTxTimeMs + " ms");
7917 }
7918 uid.noteWifiControllerActivityLocked(CONTROLLER_TX_TIME, myTxTimeMs);
7919 }
7920
7921 // Distribute the remaining Rx power appropriately between all apps that received
7922 // packets.
7923 for (int i = 0; i < rxPackets.size(); i++) {
7924 final Uid uid = getUidStatsLocked(rxPackets.keyAt(i));
7925 final long myRxTimeMs = (rxPackets.valueAt(i) * leftOverRxTimeMs) / totalRxPackets;
7926 if (DEBUG_ENERGY) {
7927 Slog.d(TAG, " RxTime for UID " + uid.getUid() + ": " + myRxTimeMs + " ms");
7928 }
7929 uid.noteWifiControllerActivityLocked(CONTROLLER_RX_TIME, myRxTimeMs);
7930 }
7931
7932 // Any left over power use will be picked up by the WiFi category in BatteryStatsHelper.
7933
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007934 // Update WiFi controller stats.
7935 mWifiActivityCounters[CONTROLLER_RX_TIME].addCountLocked(
7936 info.getControllerRxTimeMillis());
7937 mWifiActivityCounters[CONTROLLER_TX_TIME].addCountLocked(
7938 info.getControllerTxTimeMillis());
7939 mWifiActivityCounters[CONTROLLER_IDLE_TIME].addCountLocked(
7940 info.getControllerIdleTimeMillis());
Adam Lesinskie08af192015-03-25 16:42:59 -07007941
Adam Lesinski8576cf92015-06-09 12:48:25 -07007942 // POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
7943 final double opVolt = mPowerProfile.getAveragePower(
7944 PowerProfile.POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE) / 1000.0;
7945 if (opVolt != 0) {
7946 // We store the power drain as mAms.
Adam Lesinskie283d332015-04-16 12:29:25 -07007947 mWifiActivityCounters[CONTROLLER_POWER_DRAIN].addCountLocked(
Adam Lesinski8576cf92015-06-09 12:48:25 -07007948 (long)(info.getControllerEnergyUsed() / opVolt));
Adam Lesinskie08af192015-03-25 16:42:59 -07007949 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007950 }
7951 }
7952
7953 /**
7954 * Distribute Cell radio energy info and network traffic to apps.
7955 */
Adam Lesinskie08af192015-03-25 16:42:59 -07007956 public void updateMobileRadioStateLocked(final long elapsedRealtimeMs) {
Adam Lesinskia7c90c82015-06-18 14:52:24 -07007957 if (DEBUG_ENERGY) {
7958 Slog.d(TAG, "Updating mobile radio stats");
7959 }
7960
Adam Lesinskie08af192015-03-25 16:42:59 -07007961 NetworkStats delta = null;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007962 try {
Adam Lesinskie08af192015-03-25 16:42:59 -07007963 if (!ArrayUtils.isEmpty(mMobileIfaces)) {
7964 delta = getNetworkStatsDeltaLocked(mMobileIfaces, mMobileNetworkStats);
7965 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007966 } catch (IOException e) {
7967 Slog.wtf(TAG, "Failed to get mobile network stats", e);
7968 return;
7969 }
7970
7971 if (delta == null || !mOnBatteryInternal) {
7972 return;
7973 }
7974
Adam Lesinskie08af192015-03-25 16:42:59 -07007975 long radioTime = mMobileRadioActivePerAppTimer.getTimeSinceMarkLocked(
7976 elapsedRealtimeMs * 1000);
7977 mMobileRadioActivePerAppTimer.setMark(elapsedRealtimeMs);
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007978 long totalPackets = delta.getTotalPackets();
7979
7980 final int size = delta.size();
7981 for (int i = 0; i < size; i++) {
7982 final NetworkStats.Entry entry = delta.getValues(i, mTmpNetworkStatsEntry);
7983
Adam Lesinskie08af192015-03-25 16:42:59 -07007984 if (entry.rxBytes == 0 || entry.txBytes == 0) {
7985 continue;
7986 }
7987
7988 if (DEBUG_ENERGY) {
7989 Slog.d(TAG, "Mobile uid " + entry.uid + ": delta rx=" + entry.rxBytes
7990 + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets
7991 + " txPackets=" + entry.txPackets);
7992 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07007993
7994 final Uid u = getUidStatsLocked(mapUid(entry.uid));
7995 u.noteNetworkActivityLocked(NETWORK_MOBILE_RX_DATA, entry.rxBytes,
7996 entry.rxPackets);
7997 u.noteNetworkActivityLocked(NETWORK_MOBILE_TX_DATA, entry.txBytes,
7998 entry.txPackets);
7999
8000 if (radioTime > 0) {
8001 // Distribute total radio active time in to this app.
8002 long appPackets = entry.rxPackets + entry.txPackets;
8003 long appRadioTime = (radioTime*appPackets)/totalPackets;
8004 u.noteMobileRadioActiveTimeLocked(appRadioTime);
8005 // Remove this app from the totals, so that we don't lose any time
8006 // due to rounding.
8007 radioTime -= appRadioTime;
8008 totalPackets -= appPackets;
8009 }
8010
8011 mNetworkByteActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked(
8012 entry.rxBytes);
8013 mNetworkByteActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked(
8014 entry.txBytes);
8015 mNetworkPacketActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked(
8016 entry.rxPackets);
8017 mNetworkPacketActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked(
8018 entry.txPackets);
8019 }
8020
8021 if (radioTime > 0) {
8022 // Whoops, there is some radio time we can't blame on an app!
8023 mMobileRadioActiveUnknownTime.addCountLocked(radioTime);
8024 mMobileRadioActiveUnknownCount.addCountLocked(1);
8025 }
8026 }
8027
8028 /**
8029 * Distribute Bluetooth energy info and network traffic to apps.
8030 * @param info The energy information from the bluetooth controller.
8031 */
8032 public void updateBluetoothStateLocked(@Nullable final BluetoothActivityEnergyInfo info) {
Adam Lesinskia7c90c82015-06-18 14:52:24 -07008033 if (DEBUG_ENERGY) {
8034 Slog.d(TAG, "Updating bluetooth stats");
8035 }
8036
Adam Lesinski719e61f2015-05-15 15:49:24 -07008037 if (info != null && mOnBatteryInternal) {
Adam Lesinski17390762015-04-10 13:17:47 -07008038 mHasBluetoothEnergyReporting = true;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008039 mBluetoothActivityCounters[CONTROLLER_RX_TIME].addCountLocked(
8040 info.getControllerRxTimeMillis());
8041 mBluetoothActivityCounters[CONTROLLER_TX_TIME].addCountLocked(
8042 info.getControllerTxTimeMillis());
8043 mBluetoothActivityCounters[CONTROLLER_IDLE_TIME].addCountLocked(
8044 info.getControllerIdleTimeMillis());
Adam Lesinskie283d332015-04-16 12:29:25 -07008045
Adam Lesinski8576cf92015-06-09 12:48:25 -07008046 // POWER_BLUETOOTH_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
8047 final double opVolt = mPowerProfile.getAveragePower(
8048 PowerProfile.POWER_BLUETOOTH_CONTROLLER_OPERATING_VOLTAGE) / 1000.0;
8049 if (opVolt != 0) {
8050 // We store the power drain as mAms.
Adam Lesinskie283d332015-04-16 12:29:25 -07008051 mBluetoothActivityCounters[CONTROLLER_POWER_DRAIN].addCountLocked(
Adam Lesinski8576cf92015-06-09 12:48:25 -07008052 (long) (info.getControllerEnergyUsed() / opVolt));
Adam Lesinskie283d332015-04-16 12:29:25 -07008053 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008054 }
8055 }
8056
8057 /**
8058 * Read and distribute kernel wake lock use across apps.
8059 */
8060 public void updateKernelWakelocksLocked() {
8061 final KernelWakelockStats wakelockStats = mKernelWakelockReader.readKernelWakelockStats(
8062 mTmpWakelockStats);
8063 if (wakelockStats == null) {
8064 // Not crashing might make board bringup easier.
8065 Slog.w(TAG, "Couldn't get kernel wake lock stats");
8066 return;
8067 }
8068
Adam Lesinskifbabe7d2015-08-03 14:37:38 -07008069 // Record whether we've seen a non-zero time (for debugging b/22716723).
8070 boolean seenNonZeroTime = false;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008071 for (Map.Entry<String, KernelWakelockStats.Entry> ent : wakelockStats.entrySet()) {
8072 String name = ent.getKey();
8073 KernelWakelockStats.Entry kws = ent.getValue();
8074
8075 SamplingTimer kwlt = mKernelWakelockStats.get(name);
8076 if (kwlt == null) {
8077 kwlt = new SamplingTimer(mOnBatteryScreenOffTimeBase,
8078 true /* track reported val */);
8079 mKernelWakelockStats.put(name, kwlt);
8080 }
8081 kwlt.updateCurrentReportedCount(kws.mCount);
8082 kwlt.updateCurrentReportedTotalTime(kws.mTotalTime);
8083 kwlt.setUpdateVersion(kws.mVersion);
Adam Lesinskifbabe7d2015-08-03 14:37:38 -07008084
8085 if (kws.mVersion != wakelockStats.kernelWakelockVersion)
8086 seenNonZeroTime |= kws.mTotalTime > 0;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008087 }
8088
Adam Lesinskifbabe7d2015-08-03 14:37:38 -07008089 int numWakelocksSetStale = 0;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008090 if (wakelockStats.size() != mKernelWakelockStats.size()) {
8091 // Set timers to stale if they didn't appear in /proc/wakelocks this time.
8092 for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
8093 SamplingTimer st = ent.getValue();
8094 if (st.getUpdateVersion() != wakelockStats.kernelWakelockVersion) {
8095 st.setStale();
Adam Lesinskifbabe7d2015-08-03 14:37:38 -07008096 numWakelocksSetStale++;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008097 }
8098 }
8099 }
Adam Lesinskifbabe7d2015-08-03 14:37:38 -07008100
8101 if (!seenNonZeroTime) {
8102 Slog.wtf(TAG, "All kernel wakelocks had time of zero");
8103 }
8104
8105 if (numWakelocksSetStale == mKernelWakelockStats.size()) {
8106 Slog.wtf(TAG, "All kernel wakelocks were set stale. new version=" +
8107 wakelockStats.kernelWakelockVersion);
8108 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008109 }
8110
Adam Lesinski72478f02015-06-17 15:39:43 -07008111 // We use an anonymous class to access these variables,
8112 // so they can't live on the stack or they'd have to be
8113 // final MutableLong objects (more allocations).
8114 // Used in updateCpuTimeLocked().
8115 long mTempTotalCpuUserTimeUs;
8116 long mTempTotalCpuSystemTimeUs;
8117
Adam Lesinski06af1fa2015-05-05 17:35:35 -07008118 /**
Adam Lesinski72478f02015-06-17 15:39:43 -07008119 * Read and distribute CPU usage across apps. If their are partial wakelocks being held
8120 * and we are on battery with screen off, we give more of the cpu time to those apps holding
8121 * wakelocks. If the screen is on, we just assign the actual cpu time an app used.
Adam Lesinski06af1fa2015-05-05 17:35:35 -07008122 */
Adam Lesinski72478f02015-06-17 15:39:43 -07008123 public void updateCpuTimeLocked() {
Adam Lesinski52290c9c2015-09-21 16:54:52 -07008124 if (mPowerProfile == null) {
8125 return;
8126 }
8127
Adam Lesinski72478f02015-06-17 15:39:43 -07008128 if (DEBUG_ENERGY_CPU) {
8129 Slog.d(TAG, "!Cpu updating!");
8130 }
8131
8132 // Holding a wakelock costs more than just using the cpu.
8133 // Currently, we assign only half the cpu time to an app that is running but
8134 // not holding a wakelock. The apps holding wakelocks get the rest of the blame.
8135 // If no app is holding a wakelock, then the distribution is normal.
8136 final int wakelockWeight = 50;
8137
Adam Lesinski6832f392015-09-05 18:05:40 -07008138 // Read the time spent for each cluster at various cpu frequencies.
8139 final long[][] clusterSpeeds = new long[mKernelCpuSpeedReaders.length][];
8140 for (int cluster = 0; cluster < mKernelCpuSpeedReaders.length; cluster++) {
8141 clusterSpeeds[cluster] = mKernelCpuSpeedReaders[cluster].readDelta();
8142 }
Adam Lesinski72478f02015-06-17 15:39:43 -07008143
8144 int numWakelocks = 0;
8145
8146 // Calculate how many wakelocks we have to distribute amongst. The system is excluded.
8147 // Only distribute cpu power to wakelocks if the screen is off and we're on battery.
8148 final int numPartialTimers = mPartialTimers.size();
8149 if (mOnBatteryScreenOffTimeBase.isRunning()) {
8150 for (int i = 0; i < numPartialTimers; i++) {
8151 final StopwatchTimer timer = mPartialTimers.get(i);
8152 if (timer.mInList && timer.mUid != null && timer.mUid.mUid != Process.SYSTEM_UID) {
8153 // Since the collection and blaming of wakelocks can be scheduled to run after
8154 // some delay, the mPartialTimers list may have new entries. We can't blame
8155 // the newly added timer for past cpu time, so we only consider timers that
8156 // were present for one round of collection. Once a timer has gone through
8157 // a round of collection, its mInList field is set to true.
8158 numWakelocks++;
Adam Lesinski06af1fa2015-05-05 17:35:35 -07008159 }
Adam Lesinski72478f02015-06-17 15:39:43 -07008160 }
Adam Lesinski06af1fa2015-05-05 17:35:35 -07008161 }
Adam Lesinski72478f02015-06-17 15:39:43 -07008162
8163 final int numWakelocksF = numWakelocks;
8164 mTempTotalCpuUserTimeUs = 0;
8165 mTempTotalCpuSystemTimeUs = 0;
8166
8167 // Read the CPU data for each UID. This will internally generate a snapshot so next time
8168 // we read, we get a delta. If we are to distribute the cpu time, then do so. Otherwise
8169 // we just ignore the data.
8170 final long startTimeMs = SystemClock.elapsedRealtime();
8171 mKernelUidCpuTimeReader.readDelta(!mOnBatteryInternal ? null :
8172 new KernelUidCpuTimeReader.Callback() {
8173 @Override
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07008174 public void onUidCpuTime(int uid, long userTimeUs, long systemTimeUs,
8175 long powerMaUs) {
Adam Lesinski72478f02015-06-17 15:39:43 -07008176 final Uid u = getUidStatsLocked(mapUid(uid));
8177
8178 // Accumulate the total system and user time.
8179 mTempTotalCpuUserTimeUs += userTimeUs;
8180 mTempTotalCpuSystemTimeUs += systemTimeUs;
8181
8182 StringBuilder sb = null;
8183 if (DEBUG_ENERGY_CPU) {
8184 sb = new StringBuilder();
8185 sb.append(" got time for uid=").append(u.mUid).append(": u=");
8186 TimeUtils.formatDuration(userTimeUs / 1000, sb);
8187 sb.append(" s=");
8188 TimeUtils.formatDuration(systemTimeUs / 1000, sb);
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07008189 sb.append(" p=").append(powerMaUs / 1000).append("mAms\n");
Adam Lesinski72478f02015-06-17 15:39:43 -07008190 }
8191
8192 if (numWakelocksF > 0) {
8193 // We have wakelocks being held, so only give a portion of the
8194 // time to the process. The rest will be distributed among wakelock
8195 // holders.
8196 userTimeUs = (userTimeUs * wakelockWeight) / 100;
8197 systemTimeUs = (systemTimeUs * wakelockWeight) / 100;
8198 }
8199
8200 if (sb != null) {
8201 sb.append(" adding to uid=").append(u.mUid).append(": u=");
8202 TimeUtils.formatDuration(userTimeUs / 1000, sb);
8203 sb.append(" s=");
8204 TimeUtils.formatDuration(systemTimeUs / 1000, sb);
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07008205 sb.append(" p=").append(powerMaUs / 1000).append("mAms");
Adam Lesinski72478f02015-06-17 15:39:43 -07008206 Slog.d(TAG, sb.toString());
8207 }
8208
8209 u.mUserCpuTime.addCountLocked(userTimeUs);
8210 u.mSystemCpuTime.addCountLocked(systemTimeUs);
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07008211 u.mCpuPower.addCountLocked(powerMaUs);
Adam Lesinski72478f02015-06-17 15:39:43 -07008212
8213 // Add the cpu speeds to this UID. These are used as a ratio
8214 // for computing the power this UID used.
Adam Lesinski52290c9c2015-09-21 16:54:52 -07008215 final int numClusters = mPowerProfile.getNumCpuClusters();
8216 if (u.mCpuClusterSpeed == null || u.mCpuClusterSpeed.length !=
8217 numClusters) {
8218 u.mCpuClusterSpeed = new LongSamplingCounter[numClusters][];
Adam Lesinski6832f392015-09-05 18:05:40 -07008219 }
8220
8221 for (int cluster = 0; cluster < clusterSpeeds.length; cluster++) {
Adam Lesinski52290c9c2015-09-21 16:54:52 -07008222 final int speedsInCluster = mPowerProfile.getNumSpeedStepsInCpuCluster(
8223 cluster);
8224 if (u.mCpuClusterSpeed[cluster] == null || speedsInCluster !=
8225 u.mCpuClusterSpeed[cluster].length) {
Adam Lesinski6832f392015-09-05 18:05:40 -07008226 u.mCpuClusterSpeed[cluster] =
Adam Lesinski52290c9c2015-09-21 16:54:52 -07008227 new LongSamplingCounter[speedsInCluster];
Adam Lesinski72478f02015-06-17 15:39:43 -07008228 }
Adam Lesinski6832f392015-09-05 18:05:40 -07008229
8230 final LongSamplingCounter[] cpuSpeeds = u.mCpuClusterSpeed[cluster];
8231 for (int speed = 0; speed < clusterSpeeds[cluster].length; speed++) {
8232 if (cpuSpeeds[speed] == null) {
8233 cpuSpeeds[speed] = new LongSamplingCounter(mOnBatteryTimeBase);
8234 }
8235 cpuSpeeds[speed].addCountLocked(clusterSpeeds[cluster][speed]);
8236 }
Adam Lesinski72478f02015-06-17 15:39:43 -07008237 }
8238 }
8239 });
8240
8241 if (DEBUG_ENERGY_CPU) {
8242 Slog.d(TAG, "Reading cpu stats took " + (SystemClock.elapsedRealtime() - startTimeMs) +
8243 " ms");
8244 }
8245
8246 if (mOnBatteryInternal && numWakelocks > 0) {
8247 // Distribute a portion of the total cpu time to wakelock holders.
8248 mTempTotalCpuUserTimeUs = (mTempTotalCpuUserTimeUs * (100 - wakelockWeight)) / 100;
8249 mTempTotalCpuSystemTimeUs =
8250 (mTempTotalCpuSystemTimeUs * (100 - wakelockWeight)) / 100;
8251
8252 for (int i = 0; i < numPartialTimers; i++) {
8253 final StopwatchTimer timer = mPartialTimers.get(i);
8254
8255 // The system does not share any blame, as it is usually holding the wakelock
8256 // on behalf of an app.
8257 if (timer.mInList && timer.mUid != null && timer.mUid.mUid != Process.SYSTEM_UID) {
8258 int userTimeUs = (int) (mTempTotalCpuUserTimeUs / numWakelocks);
8259 int systemTimeUs = (int) (mTempTotalCpuSystemTimeUs / numWakelocks);
8260
8261 if (DEBUG_ENERGY_CPU) {
8262 StringBuilder sb = new StringBuilder();
8263 sb.append(" Distributing wakelock uid=").append(timer.mUid.mUid)
8264 .append(": u=");
8265 TimeUtils.formatDuration(userTimeUs / 1000, sb);
8266 sb.append(" s=");
8267 TimeUtils.formatDuration(systemTimeUs / 1000, sb);
8268 Slog.d(TAG, sb.toString());
8269 }
8270
8271 timer.mUid.mUserCpuTime.addCountLocked(userTimeUs);
8272 timer.mUid.mSystemCpuTime.addCountLocked(systemTimeUs);
8273
8274 final Uid.Proc proc = timer.mUid.getProcessStatsLocked("*wakelock*");
Adam Lesinski062e66c2015-07-14 12:02:44 -07008275 proc.addCpuTimeLocked(userTimeUs / 1000, systemTimeUs / 1000);
Adam Lesinski72478f02015-06-17 15:39:43 -07008276
8277 mTempTotalCpuUserTimeUs -= userTimeUs;
8278 mTempTotalCpuSystemTimeUs -= systemTimeUs;
8279 numWakelocks--;
8280 }
8281 }
8282
8283 if (mTempTotalCpuUserTimeUs > 0 || mTempTotalCpuSystemTimeUs > 0) {
8284 // Anything left over is given to the system.
8285 if (DEBUG_ENERGY_CPU) {
8286 StringBuilder sb = new StringBuilder();
8287 sb.append(" Distributing lost time to system: u=");
8288 TimeUtils.formatDuration(mTempTotalCpuUserTimeUs / 1000, sb);
8289 sb.append(" s=");
8290 TimeUtils.formatDuration(mTempTotalCpuSystemTimeUs / 1000, sb);
8291 Slog.d(TAG, sb.toString());
8292 }
8293
8294 final Uid u = getUidStatsLocked(Process.SYSTEM_UID);
8295 u.mUserCpuTime.addCountLocked(mTempTotalCpuUserTimeUs);
8296 u.mSystemCpuTime.addCountLocked(mTempTotalCpuSystemTimeUs);
8297
8298 final Uid.Proc proc = u.getProcessStatsLocked("*lost*");
Adam Lesinski062e66c2015-07-14 12:02:44 -07008299 proc.addCpuTimeLocked((int) mTempTotalCpuUserTimeUs / 1000,
8300 (int) mTempTotalCpuSystemTimeUs / 1000);
Adam Lesinski72478f02015-06-17 15:39:43 -07008301 }
8302 }
8303
8304 // See if there is a difference in wakelocks between this collection and the last
8305 // collection.
8306 if (ArrayUtils.referenceEquals(mPartialTimers, mLastPartialTimers)) {
8307 // No difference, so each timer is now considered for the next collection.
8308 for (int i = 0; i < numPartialTimers; i++) {
8309 mPartialTimers.get(i).mInList = true;
8310 }
8311 } else {
8312 // The lists are different, meaning we added (or removed a timer) since the last
8313 // collection.
8314 final int numLastPartialTimers = mLastPartialTimers.size();
8315 for (int i = 0; i < numLastPartialTimers; i++) {
8316 mLastPartialTimers.get(i).mInList = false;
8317 }
8318 mLastPartialTimers.clear();
8319
8320 // Mark the current timers as gone through a collection.
8321 for (int i = 0; i < numPartialTimers; i++) {
8322 final StopwatchTimer timer = mPartialTimers.get(i);
8323 timer.mInList = true;
8324 mLastPartialTimers.add(timer);
8325 }
8326 }
Adam Lesinski06af1fa2015-05-05 17:35:35 -07008327 }
8328
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008329 boolean setChargingLocked(boolean charging) {
8330 if (mCharging != charging) {
8331 mCharging = charging;
8332 if (charging) {
Dianne Hackborn0c820db2015-04-14 17:47:34 -07008333 mHistoryCur.states2 |= HistoryItem.STATE2_CHARGING_FLAG;
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008334 } else {
Dianne Hackborn0c820db2015-04-14 17:47:34 -07008335 mHistoryCur.states2 &= ~HistoryItem.STATE2_CHARGING_FLAG;
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008336 }
8337 mHandler.sendEmptyMessage(MSG_REPORT_CHARGING);
8338 return true;
8339 }
8340 return false;
8341 }
8342
Dianne Hackborn40c87252014-03-19 16:55:40 -07008343 void setOnBatteryLocked(final long mSecRealtime, final long mSecUptime, final boolean onBattery,
8344 final int oldStatus, final int level) {
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008345 boolean doWrite = false;
8346 Message m = mHandler.obtainMessage(MSG_REPORT_POWER_CHANGE);
8347 m.arg1 = onBattery ? 1 : 0;
8348 mHandler.sendMessage(m);
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008349
Dianne Hackborn40c87252014-03-19 16:55:40 -07008350 final long uptime = mSecUptime * 1000;
8351 final long realtime = mSecRealtime * 1000;
Jeff Browne95c3cd2014-05-02 16:59:26 -07008352 final boolean screenOn = mScreenState == Display.STATE_ON;
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008353 if (onBattery) {
8354 // We will reset our status if we are unplugging after the
8355 // battery was last full, or the level is at 100, or
8356 // we have gone through a significant charge (from a very low
8357 // level to a now very high level).
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08008358 boolean reset = false;
Dianne Hackborn9a755432014-05-15 17:05:22 -07008359 if (!mNoAutoReset && (oldStatus == BatteryManager.BATTERY_STATUS_FULL
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008360 || level >= 90
Dianne Hackbornfb3809c2014-09-29 18:31:22 -07008361 || (mDischargeCurrentLevel < 20 && level >= 80)
8362 || (getHighDischargeAmountSinceCharge() >= 200
8363 && mHistoryBuffer.dataSize() >= MAX_HISTORY_BUFFER))) {
Dianne Hackborn73d6a822014-09-29 10:52:47 -07008364 Slog.i(TAG, "Resetting battery stats: level=" + level + " status=" + oldStatus
Dianne Hackbornfb3809c2014-09-29 18:31:22 -07008365 + " dischargeLevel=" + mDischargeCurrentLevel
Dianne Hackborn73d6a822014-09-29 10:52:47 -07008366 + " lowAmount=" + getLowDischargeAmountSinceCharge()
8367 + " highAmount=" + getHighDischargeAmountSinceCharge());
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07008368 // Before we write, collect a snapshot of the final aggregated
8369 // stats to be reported in the next checkin. Only do this if we have
8370 // a sufficient amount of data to make it interesting.
8371 if (getLowDischargeAmountSinceCharge() >= 20) {
8372 final Parcel parcel = Parcel.obtain();
8373 writeSummaryToParcel(parcel, true);
8374 BackgroundThread.getHandler().post(new Runnable() {
8375 @Override public void run() {
8376 synchronized (mCheckinFile) {
8377 FileOutputStream stream = null;
8378 try {
8379 stream = mCheckinFile.startWrite();
8380 stream.write(parcel.marshall());
8381 stream.flush();
8382 FileUtils.sync(stream);
8383 stream.close();
8384 mCheckinFile.finishWrite(stream);
8385 } catch (IOException e) {
8386 Slog.w("BatteryStats",
8387 "Error writing checkin battery statistics", e);
8388 mCheckinFile.failWrite(stream);
8389 } finally {
8390 parcel.recycle();
8391 }
8392 }
8393 }
8394 });
8395 }
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008396 doWrite = true;
8397 resetAllStatsLocked();
8398 mDischargeStartLevel = level;
Dianne Hackborneaf2ac42014-02-07 13:01:07 -08008399 reset = true;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008400 mDischargeStepTracker.init();
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008401 }
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008402 if (mCharging) {
8403 setChargingLocked(false);
8404 }
8405 mLastChargingStateLevel = level;
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08008406 mOnBattery = mOnBatteryInternal = true;
Dianne Hackborn260c5022014-04-29 11:23:16 -07008407 mLastDischargeStepLevel = level;
Dianne Hackborn29325132014-05-21 15:01:03 -07008408 mMinDischargeStepLevel = level;
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008409 mDischargeStepTracker.clearTime();
8410 mDailyDischargeStepTracker.clearTime();
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07008411 mInitStepMode = mCurStepMode;
8412 mModStepMode = 0;
Dianne Hackborna7c837f2014-01-15 16:20:44 -08008413 pullPendingStateUpdatesLocked();
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008414 mHistoryCur.batteryLevel = (byte)level;
8415 mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
8416 if (DEBUG_HISTORY) Slog.v(TAG, "Battery unplugged to: "
8417 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborna1bd7922014-03-21 11:07:11 -07008418 if (reset) {
8419 mRecordingHistory = true;
8420 startRecordingHistory(mSecRealtime, mSecUptime, reset);
8421 }
Dianne Hackborn40c87252014-03-19 16:55:40 -07008422 addHistoryRecordLocked(mSecRealtime, mSecUptime);
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008423 mDischargeCurrentLevel = mDischargeUnplugLevel = level;
Jeff Browne95c3cd2014-05-02 16:59:26 -07008424 if (screenOn) {
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008425 mDischargeScreenOnUnplugLevel = level;
8426 mDischargeScreenOffUnplugLevel = 0;
8427 } else {
8428 mDischargeScreenOnUnplugLevel = 0;
8429 mDischargeScreenOffUnplugLevel = level;
8430 }
8431 mDischargeAmountScreenOn = 0;
8432 mDischargeAmountScreenOff = 0;
Jeff Browne95c3cd2014-05-02 16:59:26 -07008433 updateTimeBasesLocked(true, !screenOn, uptime, realtime);
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008434 } else {
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008435 mLastChargingStateLevel = level;
Dianne Hackbornd1eccbe2015-02-18 14:02:14 -08008436 mOnBattery = mOnBatteryInternal = false;
Dianne Hackborna7c837f2014-01-15 16:20:44 -08008437 pullPendingStateUpdatesLocked();
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008438 mHistoryCur.batteryLevel = (byte)level;
8439 mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
8440 if (DEBUG_HISTORY) Slog.v(TAG, "Battery plugged to: "
8441 + Integer.toHexString(mHistoryCur.states));
Dianne Hackborn40c87252014-03-19 16:55:40 -07008442 addHistoryRecordLocked(mSecRealtime, mSecUptime);
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07008443 mDischargeCurrentLevel = mDischargePlugLevel = level;
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008444 if (level < mDischargeUnplugLevel) {
8445 mLowDischargeAmountSinceCharge += mDischargeUnplugLevel-level-1;
8446 mHighDischargeAmountSinceCharge += mDischargeUnplugLevel-level;
8447 }
Jeff Browne95c3cd2014-05-02 16:59:26 -07008448 updateDischargeScreenLevelsLocked(screenOn, screenOn);
8449 updateTimeBasesLocked(false, !screenOn, uptime, realtime);
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008450 mChargeStepTracker.init();
Dianne Hackborn260c5022014-04-29 11:23:16 -07008451 mLastChargeStepLevel = level;
Dianne Hackborn29325132014-05-21 15:01:03 -07008452 mMaxChargeStepLevel = level;
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07008453 mInitStepMode = mCurStepMode;
8454 mModStepMode = 0;
Dianne Hackborn32de2f62011-03-09 14:03:35 -08008455 }
8456 if (doWrite || (mLastWriteTime + (60 * 1000)) < mSecRealtime) {
8457 if (mFile != null) {
8458 writeAsyncLocked();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008459 }
8460 }
8461 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07008462
Dianne Hackborna1bd7922014-03-21 11:07:11 -07008463 private void startRecordingHistory(final long elapsedRealtimeMs, final long uptimeMs,
8464 boolean reset) {
8465 mRecordingHistory = true;
8466 mHistoryCur.currentTime = System.currentTimeMillis();
Dianne Hackborn37de0982014-05-09 09:32:18 -07008467 addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs,
8468 reset ? HistoryItem.CMD_RESET : HistoryItem.CMD_CURRENT_TIME,
Dianne Hackborna1bd7922014-03-21 11:07:11 -07008469 mHistoryCur);
8470 mHistoryCur.currentTime = 0;
8471 if (reset) {
8472 initActiveHistoryEventsLocked(elapsedRealtimeMs, uptimeMs);
8473 }
8474 }
8475
Dianne Hackborn7d9eefd2014-08-27 18:30:31 -07008476 private void recordCurrentTimeChangeLocked(final long currentTime, final long elapsedRealtimeMs,
8477 final long uptimeMs) {
8478 if (mRecordingHistory) {
8479 mHistoryCur.currentTime = currentTime;
8480 addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_CURRENT_TIME,
8481 mHistoryCur);
8482 mHistoryCur.currentTime = 0;
8483 }
8484 }
8485
Dianne Hackborn29cd7f12015-01-08 10:37:05 -08008486 private void recordShutdownLocked(final long elapsedRealtimeMs, final long uptimeMs) {
8487 if (mRecordingHistory) {
8488 mHistoryCur.currentTime = System.currentTimeMillis();
Dianne Hackborn29cd7f12015-01-08 10:37:05 -08008489 addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_SHUTDOWN,
8490 mHistoryCur);
8491 mHistoryCur.currentTime = 0;
8492 }
8493 }
8494
Dianne Hackborn0c820db2015-04-14 17:47:34 -07008495 private void scheduleSyncExternalStatsLocked(String reason) {
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008496 if (mExternalSync != null) {
Dianne Hackborn0c820db2015-04-14 17:47:34 -07008497 mExternalSync.scheduleSync(reason);
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008498 }
8499 }
8500
Adam Lesinskia7c90c82015-06-18 14:52:24 -07008501 private void scheduleSyncExternalWifiStatsLocked(String reason) {
8502 if (mExternalSync != null) {
8503 mExternalSync.scheduleWifiSync(reason);
8504 }
8505 }
8506
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008507 // This should probably be exposed in the API, though it's not critical
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008508 public static final int BATTERY_PLUGGED_NONE = 0;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07008509
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008510 public void setBatteryStateLocked(int status, int health, int plugType, int level,
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008511 int temp, int volt) {
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008512 final boolean onBattery = plugType == BATTERY_PLUGGED_NONE;
8513 final long uptime = SystemClock.uptimeMillis();
8514 final long elapsedRealtime = SystemClock.elapsedRealtime();
8515 if (!mHaveBatteryLevel) {
8516 mHaveBatteryLevel = true;
8517 // We start out assuming that the device is plugged in (not
8518 // on battery). If our first report is now that we are indeed
8519 // plugged in, then twiddle our state to correctly reflect that
8520 // since we won't be going through the full setOnBattery().
8521 if (onBattery == mOnBattery) {
Dianne Hackborn260c5022014-04-29 11:23:16 -07008522 if (onBattery) {
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008523 mHistoryCur.states &= ~HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
Dianne Hackborn260c5022014-04-29 11:23:16 -07008524 } else {
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008525 mHistoryCur.states |= HistoryItem.STATE_BATTERY_PLUGGED_FLAG;
Dianne Hackborn260c5022014-04-29 11:23:16 -07008526 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008527 }
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008528 // Always start out assuming charging, that will be updated later.
Dianne Hackborn0c820db2015-04-14 17:47:34 -07008529 mHistoryCur.states2 |= HistoryItem.STATE2_CHARGING_FLAG;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008530 mHistoryCur.batteryStatus = (byte)status;
8531 mHistoryCur.batteryLevel = (byte)level;
8532 mMaxChargeStepLevel = mMinDischargeStepLevel =
8533 mLastChargeStepLevel = mLastDischargeStepLevel = level;
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008534 mLastChargingStateLevel = level;
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008535 } else if (mCurrentBatteryLevel != level || mOnBattery != onBattery) {
8536 recordDailyStatsIfNeededLocked(level >= 100 && onBattery);
8537 }
8538 int oldStatus = mHistoryCur.batteryStatus;
8539 if (onBattery) {
8540 mDischargeCurrentLevel = level;
8541 if (!mRecordingHistory) {
8542 mRecordingHistory = true;
8543 startRecordingHistory(elapsedRealtime, uptime, true);
8544 }
8545 } else if (level < 96) {
8546 if (!mRecordingHistory) {
8547 mRecordingHistory = true;
8548 startRecordingHistory(elapsedRealtime, uptime, true);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008549 }
Dianne Hackborn32907cf2010-06-10 17:50:20 -07008550 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008551 mCurrentBatteryLevel = level;
8552 if (mDischargePlugLevel < 0) {
8553 mDischargePlugLevel = level;
Marco Nelissend8593312009-04-30 14:45:06 -07008554 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008555 if (onBattery != mOnBattery) {
8556 mHistoryCur.batteryLevel = (byte)level;
8557 mHistoryCur.batteryStatus = (byte)status;
8558 mHistoryCur.batteryHealth = (byte)health;
8559 mHistoryCur.batteryPlugType = (byte)plugType;
8560 mHistoryCur.batteryTemperature = (short)temp;
8561 mHistoryCur.batteryVoltage = (char)volt;
8562 setOnBatteryLocked(elapsedRealtime, uptime, onBattery, oldStatus, level);
8563 } else {
8564 boolean changed = false;
8565 if (mHistoryCur.batteryLevel != level) {
8566 mHistoryCur.batteryLevel = (byte)level;
8567 changed = true;
Marco Nelissend8593312009-04-30 14:45:06 -07008568
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008569 // TODO(adamlesinski): Schedule the creation of a HistoryStepDetails record
8570 // which will pull external stats.
Dianne Hackborn0c820db2015-04-14 17:47:34 -07008571 scheduleSyncExternalStatsLocked("battery-level");
Evan Millarc64edde2009-04-18 12:26:32 -07008572 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008573 if (mHistoryCur.batteryStatus != status) {
8574 mHistoryCur.batteryStatus = (byte)status;
8575 changed = true;
8576 }
8577 if (mHistoryCur.batteryHealth != health) {
8578 mHistoryCur.batteryHealth = (byte)health;
8579 changed = true;
8580 }
8581 if (mHistoryCur.batteryPlugType != plugType) {
8582 mHistoryCur.batteryPlugType = (byte)plugType;
8583 changed = true;
8584 }
8585 if (temp >= (mHistoryCur.batteryTemperature+10)
8586 || temp <= (mHistoryCur.batteryTemperature-10)) {
8587 mHistoryCur.batteryTemperature = (short)temp;
8588 changed = true;
8589 }
8590 if (volt > (mHistoryCur.batteryVoltage+20)
8591 || volt < (mHistoryCur.batteryVoltage-20)) {
8592 mHistoryCur.batteryVoltage = (char)volt;
8593 changed = true;
8594 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008595 long modeBits = (((long)mInitStepMode) << STEP_LEVEL_INITIAL_MODE_SHIFT)
8596 | (((long)mModStepMode) << STEP_LEVEL_MODIFIED_MODE_SHIFT)
8597 | (((long)(level&0xff)) << STEP_LEVEL_LEVEL_SHIFT);
8598 if (onBattery) {
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008599 changed |= setChargingLocked(false);
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008600 if (mLastDischargeStepLevel != level && mMinDischargeStepLevel > level) {
8601 mDischargeStepTracker.addLevelSteps(mLastDischargeStepLevel - level,
8602 modeBits, elapsedRealtime);
8603 mDailyDischargeStepTracker.addLevelSteps(mLastDischargeStepLevel - level,
8604 modeBits, elapsedRealtime);
8605 mLastDischargeStepLevel = level;
8606 mMinDischargeStepLevel = level;
8607 mInitStepMode = mCurStepMode;
8608 mModStepMode = 0;
8609 }
8610 } else {
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008611 if (level >= 90) {
8612 // If the battery level is at least 90%, always consider the device to be
8613 // charging even if it happens to go down a level.
8614 changed |= setChargingLocked(true);
8615 mLastChargeStepLevel = level;
8616 } if (!mCharging) {
8617 if (mLastChargeStepLevel < level) {
8618 // We have not reporting that we are charging, but the level has now
8619 // gone up, so consider the state to be charging.
8620 changed |= setChargingLocked(true);
8621 mLastChargeStepLevel = level;
8622 }
8623 } else {
8624 if (mLastChargeStepLevel > level) {
8625 // We had reported that the device was charging, but here we are with
8626 // power connected and the level going down. Looks like the current
8627 // power supplied isn't enough, so consider the device to now be
8628 // discharging.
8629 changed |= setChargingLocked(false);
8630 mLastChargeStepLevel = level;
8631 }
8632 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008633 if (mLastChargeStepLevel != level && mMaxChargeStepLevel < level) {
8634 mChargeStepTracker.addLevelSteps(level - mLastChargeStepLevel,
8635 modeBits, elapsedRealtime);
8636 mDailyChargeStepTracker.addLevelSteps(level - mLastChargeStepLevel,
8637 modeBits, elapsedRealtime);
8638 mLastChargeStepLevel = level;
8639 mMaxChargeStepLevel = level;
8640 mInitStepMode = mCurStepMode;
8641 mModStepMode = 0;
Evan Millarc64edde2009-04-18 12:26:32 -07008642 }
8643 }
Dianne Hackborn4870e9d2015-04-08 16:55:47 -07008644 if (changed) {
8645 addHistoryRecordLocked(elapsedRealtime, uptime);
8646 }
Evan Millarc64edde2009-04-18 12:26:32 -07008647 }
Adam Lesinski4b6bd8d2015-03-19 14:35:45 -07008648 if (!onBattery && status == BatteryManager.BATTERY_STATUS_FULL) {
8649 // We don't record history while we are plugged in and fully charged.
8650 // The next time we are unplugged, history will be cleared.
8651 mRecordingHistory = DEBUG;
Dianne Hackbornd0c5b9a2014-02-21 16:19:05 -08008652 }
Adam Lesinski33dac552015-03-09 15:24:48 -07008653 }
8654
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008655 public long getAwakeTimeBattery() {
8656 return computeBatteryUptime(getBatteryUptimeLocked(), STATS_CURRENT);
8657 }
8658
8659 public long getAwakeTimePlugged() {
8660 return (SystemClock.uptimeMillis() * 1000) - getAwakeTimeBattery();
8661 }
8662
8663 @Override
8664 public long computeUptime(long curTime, int which) {
8665 switch (which) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008666 case STATS_SINCE_CHARGED: return mUptime + (curTime-mUptimeStart);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008667 case STATS_CURRENT: return (curTime-mUptimeStart);
Dianne Hackborn4590e522014-03-24 13:36:46 -07008668 case STATS_SINCE_UNPLUGGED: return (curTime-mOnBatteryTimeBase.getUptimeStart());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008669 }
8670 return 0;
8671 }
8672
8673 @Override
8674 public long computeRealtime(long curTime, int which) {
8675 switch (which) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008676 case STATS_SINCE_CHARGED: return mRealtime + (curTime-mRealtimeStart);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008677 case STATS_CURRENT: return (curTime-mRealtimeStart);
Dianne Hackborn4590e522014-03-24 13:36:46 -07008678 case STATS_SINCE_UNPLUGGED: return (curTime-mOnBatteryTimeBase.getRealtimeStart());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008679 }
8680 return 0;
8681 }
8682
8683 @Override
8684 public long computeBatteryUptime(long curTime, int which) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08008685 return mOnBatteryTimeBase.computeUptime(curTime, which);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008686 }
8687
8688 @Override
8689 public long computeBatteryRealtime(long curTime, int which) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08008690 return mOnBatteryTimeBase.computeRealtime(curTime, which);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008691 }
8692
Dianne Hackborn97ae5382014-03-05 16:43:25 -08008693 @Override
8694 public long computeBatteryScreenOffUptime(long curTime, int which) {
8695 return mOnBatteryScreenOffTimeBase.computeUptime(curTime, which);
8696 }
8697
8698 @Override
8699 public long computeBatteryScreenOffRealtime(long curTime, int which) {
8700 return mOnBatteryScreenOffTimeBase.computeRealtime(curTime, which);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008701 }
8702
Dianne Hackborn260c5022014-04-29 11:23:16 -07008703 private long computeTimePerLevel(long[] steps, int numSteps) {
8704 // For now we'll do a simple average across all steps.
8705 if (numSteps <= 0) {
8706 return -1;
8707 }
8708 long total = 0;
8709 for (int i=0; i<numSteps; i++) {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07008710 total += steps[i] & STEP_LEVEL_TIME_MASK;
Dianne Hackborn260c5022014-04-29 11:23:16 -07008711 }
8712 return total / numSteps;
8713 /*
8714 long[] buckets = new long[numSteps];
8715 int numBuckets = 0;
8716 int numToAverage = 4;
8717 int i = 0;
8718 while (i < numSteps) {
8719 long totalTime = 0;
8720 int num = 0;
8721 for (int j=0; j<numToAverage && (i+j)<numSteps; j++) {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07008722 totalTime += steps[i+j] & STEP_LEVEL_TIME_MASK;
Dianne Hackborn260c5022014-04-29 11:23:16 -07008723 num++;
8724 }
8725 buckets[numBuckets] = totalTime / num;
8726 numBuckets++;
8727 numToAverage *= 2;
8728 i += num;
8729 }
8730 if (numBuckets < 1) {
8731 return -1;
8732 }
8733 long averageTime = buckets[numBuckets-1];
8734 for (i=numBuckets-2; i>=0; i--) {
8735 averageTime = (averageTime + buckets[i]) / 2;
8736 }
8737 return averageTime;
8738 */
8739 }
8740
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07008741 @Override
8742 public long computeBatteryTimeRemaining(long curTime) {
8743 if (!mOnBattery) {
8744 return -1;
8745 }
Dianne Hackborn260c5022014-04-29 11:23:16 -07008746 /* Simple implementation just looks at the average discharge per level across the
8747 entire sample period.
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07008748 int discharge = (getLowDischargeAmountSinceCharge()+getHighDischargeAmountSinceCharge())/2;
8749 if (discharge < 2) {
8750 return -1;
8751 }
8752 long duration = computeBatteryRealtime(curTime, STATS_SINCE_CHARGED);
8753 if (duration < 1000*1000) {
8754 return -1;
8755 }
8756 long usPerLevel = duration/discharge;
8757 return usPerLevel * mCurrentBatteryLevel;
Dianne Hackborn260c5022014-04-29 11:23:16 -07008758 */
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008759 if (mDischargeStepTracker.mNumStepDurations < 1) {
Dianne Hackborn260c5022014-04-29 11:23:16 -07008760 return -1;
8761 }
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008762 long msPerLevel = mDischargeStepTracker.computeTimePerLevel();
Dianne Hackborn260c5022014-04-29 11:23:16 -07008763 if (msPerLevel <= 0) {
8764 return -1;
8765 }
8766 return (msPerLevel * mCurrentBatteryLevel) * 1000;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07008767 }
8768
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008769 @Override
8770 public LevelStepTracker getDischargeLevelStepTracker() {
8771 return mDischargeStepTracker;
Dianne Hackbornab5c0ea2014-04-29 14:53:32 -07008772 }
8773
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008774 @Override
8775 public LevelStepTracker getDailyDischargeLevelStepTracker() {
8776 return mDailyDischargeStepTracker;
Dianne Hackbornab5c0ea2014-04-29 14:53:32 -07008777 }
8778
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07008779 @Override
8780 public long computeChargeTimeRemaining(long curTime) {
Dianne Hackborn260c5022014-04-29 11:23:16 -07008781 if (mOnBattery) {
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07008782 // Not yet working.
8783 return -1;
8784 }
Dianne Hackborn260c5022014-04-29 11:23:16 -07008785 /* Broken
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07008786 int curLevel = mCurrentBatteryLevel;
8787 int plugLevel = mDischargePlugLevel;
8788 if (plugLevel < 0 || curLevel < (plugLevel+1)) {
8789 return -1;
8790 }
8791 long duration = computeBatteryRealtime(curTime, STATS_SINCE_UNPLUGGED);
8792 if (duration < 1000*1000) {
8793 return -1;
8794 }
8795 long usPerLevel = duration/(curLevel-plugLevel);
8796 return usPerLevel * (100-curLevel);
Dianne Hackborn260c5022014-04-29 11:23:16 -07008797 */
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008798 if (mChargeStepTracker.mNumStepDurations < 1) {
Dianne Hackborn260c5022014-04-29 11:23:16 -07008799 return -1;
8800 }
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008801 long msPerLevel = mChargeStepTracker.computeTimePerLevel();
Dianne Hackborn260c5022014-04-29 11:23:16 -07008802 if (msPerLevel <= 0) {
8803 return -1;
8804 }
8805 return (msPerLevel * (100-mCurrentBatteryLevel)) * 1000;
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07008806 }
8807
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008808 @Override
8809 public LevelStepTracker getChargeLevelStepTracker() {
8810 return mChargeStepTracker;
Dianne Hackbornab5c0ea2014-04-29 14:53:32 -07008811 }
8812
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08008813 @Override
8814 public LevelStepTracker getDailyChargeLevelStepTracker() {
8815 return mDailyChargeStepTracker;
Dianne Hackbornab5c0ea2014-04-29 14:53:32 -07008816 }
8817
Dianne Hackborn88e98df2015-03-23 13:29:14 -07008818 @Override
8819 public ArrayList<PackageChange> getDailyPackageChanges() {
8820 return mDailyPackageChanges;
8821 }
8822
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008823 long getBatteryUptimeLocked() {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08008824 return mOnBatteryTimeBase.getUptime(SystemClock.uptimeMillis() * 1000);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008825 }
8826
8827 @Override
8828 public long getBatteryUptime(long curTime) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08008829 return mOnBatteryTimeBase.getUptime(curTime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008830 }
8831
8832 @Override
8833 public long getBatteryRealtime(long curTime) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08008834 return mOnBatteryTimeBase.getRealtime(curTime);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008835 }
Amith Yamasani3718aaa2009-06-09 06:32:35 -07008836
The Android Open Source Project10592532009-03-18 17:39:46 -07008837 @Override
Evan Millar633a1742009-04-02 16:36:33 -07008838 public int getDischargeStartLevel() {
The Android Open Source Project10592532009-03-18 17:39:46 -07008839 synchronized(this) {
Evan Millar633a1742009-04-02 16:36:33 -07008840 return getDischargeStartLevelLocked();
The Android Open Source Project10592532009-03-18 17:39:46 -07008841 }
8842 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07008843
Evan Millar633a1742009-04-02 16:36:33 -07008844 public int getDischargeStartLevelLocked() {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008845 return mDischargeUnplugLevel;
The Android Open Source Project10592532009-03-18 17:39:46 -07008846 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07008847
The Android Open Source Project10592532009-03-18 17:39:46 -07008848 @Override
Evan Millar633a1742009-04-02 16:36:33 -07008849 public int getDischargeCurrentLevel() {
The Android Open Source Project10592532009-03-18 17:39:46 -07008850 synchronized(this) {
Evan Millar633a1742009-04-02 16:36:33 -07008851 return getDischargeCurrentLevelLocked();
The Android Open Source Project10592532009-03-18 17:39:46 -07008852 }
8853 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07008854
Evan Millar633a1742009-04-02 16:36:33 -07008855 public int getDischargeCurrentLevelLocked() {
Dianne Hackborne4a59512010-12-07 11:08:07 -08008856 return mDischargeCurrentLevel;
The Android Open Source Project10592532009-03-18 17:39:46 -07008857 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008858
Amith Yamasanie43530a2009-08-21 13:11:37 -07008859 @Override
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07008860 public int getLowDischargeAmountSinceCharge() {
8861 synchronized(this) {
Dianne Hackborne4a59512010-12-07 11:08:07 -08008862 int val = mLowDischargeAmountSinceCharge;
8863 if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
8864 val += mDischargeUnplugLevel-mDischargeCurrentLevel-1;
8865 }
8866 return val;
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07008867 }
8868 }
8869
8870 @Override
8871 public int getHighDischargeAmountSinceCharge() {
8872 synchronized(this) {
Dianne Hackborne4a59512010-12-07 11:08:07 -08008873 int val = mHighDischargeAmountSinceCharge;
8874 if (mOnBattery && mDischargeCurrentLevel < mDischargeUnplugLevel) {
8875 val += mDischargeUnplugLevel-mDischargeCurrentLevel;
8876 }
8877 return val;
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07008878 }
8879 }
Dianne Hackborn40c87252014-03-19 16:55:40 -07008880
8881 @Override
8882 public int getDischargeAmount(int which) {
8883 int dischargeAmount = which == STATS_SINCE_CHARGED
8884 ? getHighDischargeAmountSinceCharge()
8885 : (getDischargeStartLevel() - getDischargeCurrentLevel());
8886 if (dischargeAmount < 0) {
8887 dischargeAmount = 0;
8888 }
8889 return dischargeAmount;
8890 }
8891
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08008892 public int getDischargeAmountScreenOn() {
8893 synchronized(this) {
8894 int val = mDischargeAmountScreenOn;
Jeff Browne95c3cd2014-05-02 16:59:26 -07008895 if (mOnBattery && mScreenState == Display.STATE_ON
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08008896 && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
8897 val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
8898 }
8899 return val;
8900 }
8901 }
8902
8903 public int getDischargeAmountScreenOnSinceCharge() {
8904 synchronized(this) {
8905 int val = mDischargeAmountScreenOnSinceCharge;
Jeff Browne95c3cd2014-05-02 16:59:26 -07008906 if (mOnBattery && mScreenState == Display.STATE_ON
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08008907 && mDischargeCurrentLevel < mDischargeScreenOnUnplugLevel) {
8908 val += mDischargeScreenOnUnplugLevel-mDischargeCurrentLevel;
8909 }
8910 return val;
8911 }
8912 }
8913
8914 public int getDischargeAmountScreenOff() {
8915 synchronized(this) {
8916 int val = mDischargeAmountScreenOff;
Jeff Browne95c3cd2014-05-02 16:59:26 -07008917 if (mOnBattery && mScreenState != Display.STATE_ON
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08008918 && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
8919 val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
8920 }
8921 return val;
8922 }
8923 }
8924
8925 public int getDischargeAmountScreenOffSinceCharge() {
8926 synchronized(this) {
8927 int val = mDischargeAmountScreenOffSinceCharge;
Jeff Browne95c3cd2014-05-02 16:59:26 -07008928 if (mOnBattery && mScreenState != Display.STATE_ON
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08008929 && mDischargeCurrentLevel < mDischargeScreenOffUnplugLevel) {
8930 val += mDischargeScreenOffUnplugLevel-mDischargeCurrentLevel;
8931 }
8932 return val;
8933 }
8934 }
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07008935
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008936 /**
8937 * Retrieve the statistics object for a particular uid, creating if needed.
8938 */
8939 public Uid getUidStatsLocked(int uid) {
8940 Uid u = mUidStats.get(uid);
8941 if (u == null) {
8942 u = new Uid(uid);
8943 mUidStats.put(uid, u);
8944 }
8945 return u;
8946 }
8947
8948 /**
8949 * Remove the statistics object for a particular uid.
8950 */
8951 public void removeUidStatsLocked(int uid) {
Adam Lesinskib83ffee2015-05-12 14:43:47 -07008952 mKernelUidCpuTimeReader.removeUid(uid);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008953 mUidStats.remove(uid);
8954 }
Amith Yamasani32dbefd2009-06-19 09:21:17 -07008955
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008956 /**
8957 * Retrieve the statistics object for a particular process, creating
8958 * if needed.
8959 */
8960 public Uid.Proc getProcessStatsLocked(int uid, String name) {
Dianne Hackbornbbb74722014-03-13 09:50:24 -07008961 uid = mapUid(uid);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008962 Uid u = getUidStatsLocked(uid);
8963 return u.getProcessStatsLocked(name);
8964 }
8965
8966 /**
8967 * Retrieve the statistics object for a particular process, creating
8968 * if needed.
8969 */
8970 public Uid.Pkg getPackageStatsLocked(int uid, String pkg) {
Dianne Hackbornbbb74722014-03-13 09:50:24 -07008971 uid = mapUid(uid);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008972 Uid u = getUidStatsLocked(uid);
8973 return u.getPackageStatsLocked(pkg);
8974 }
8975
8976 /**
8977 * Retrieve the statistics object for a particular service, creating
8978 * if needed.
8979 */
8980 public Uid.Pkg.Serv getServiceStatsLocked(int uid, String pkg, String name) {
Dianne Hackbornbbb74722014-03-13 09:50:24 -07008981 uid = mapUid(uid);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08008982 Uid u = getUidStatsLocked(uid);
8983 return u.getServiceStatsLocked(pkg, name);
8984 }
8985
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008986 public void shutdownLocked() {
Dianne Hackborn29cd7f12015-01-08 10:37:05 -08008987 recordShutdownLocked(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
Dianne Hackbornce2ef762010-09-20 11:39:14 -07008988 writeSyncLocked();
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07008989 mShuttingDown = true;
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07008990 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07008991
Dianne Hackbornce2ef762010-09-20 11:39:14 -07008992 Parcel mPendingWrite = null;
8993 final ReentrantLock mWriteLock = new ReentrantLock();
8994
8995 public void writeAsyncLocked() {
8996 writeLocked(false);
8997 }
8998
8999 public void writeSyncLocked() {
9000 writeLocked(true);
9001 }
9002
9003 void writeLocked(boolean sync) {
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009004 if (mFile == null) {
9005 Slog.w("BatteryStats", "writeLocked: no file associated with this instance");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009006 return;
9007 }
9008
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009009 if (mShuttingDown) {
9010 return;
9011 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009012
Dianne Hackbornce2ef762010-09-20 11:39:14 -07009013 Parcel out = Parcel.obtain();
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07009014 writeSummaryToParcel(out, true);
Dianne Hackbornce2ef762010-09-20 11:39:14 -07009015 mLastWriteTime = SystemClock.elapsedRealtime();
9016
9017 if (mPendingWrite != null) {
9018 mPendingWrite.recycle();
9019 }
9020 mPendingWrite = out;
9021
9022 if (sync) {
9023 commitPendingDataToDisk();
9024 } else {
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07009025 BackgroundThread.getHandler().post(new Runnable() {
9026 @Override public void run() {
Dianne Hackbornce2ef762010-09-20 11:39:14 -07009027 commitPendingDataToDisk();
9028 }
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07009029 });
Dianne Hackbornce2ef762010-09-20 11:39:14 -07009030 }
9031 }
9032
9033 public void commitPendingDataToDisk() {
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07009034 final Parcel next;
Dianne Hackbornce2ef762010-09-20 11:39:14 -07009035 synchronized (this) {
9036 next = mPendingWrite;
9037 mPendingWrite = null;
Dianne Hackbornf47d8f22010-10-08 10:46:55 -07009038 if (next == null) {
9039 return;
9040 }
Dianne Hackbornce2ef762010-09-20 11:39:14 -07009041
9042 mWriteLock.lock();
9043 }
9044
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009045 try {
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009046 FileOutputStream stream = new FileOutputStream(mFile.chooseForWrite());
Dianne Hackbornce2ef762010-09-20 11:39:14 -07009047 stream.write(next.marshall());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009048 stream.flush();
Dianne Hackborn8bdf5932010-10-15 12:54:40 -07009049 FileUtils.sync(stream);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009050 stream.close();
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009051 mFile.commit();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009052 } catch (IOException e) {
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009053 Slog.w("BatteryStats", "Error writing battery statistics", e);
Dianne Hackbornce2ef762010-09-20 11:39:14 -07009054 mFile.rollback();
9055 } finally {
9056 next.recycle();
9057 mWriteLock.unlock();
Suchi Amalapurapu8550f252009-09-29 15:20:32 -07009058 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009059 }
9060
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009061 public void readLocked() {
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08009062 if (mDailyFile != null) {
9063 readDailyStatsLocked();
9064 }
9065
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009066 if (mFile == null) {
9067 Slog.w("BatteryStats", "readLocked: no file associated with this instance");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009068 return;
9069 }
9070
9071 mUidStats.clear();
9072
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009073 try {
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009074 File file = mFile.chooseForRead();
9075 if (!file.exists()) {
9076 return;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009077 }
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009078 FileInputStream stream = new FileInputStream(file);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009079
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07009080 byte[] raw = BatteryStatsHelper.readFully(stream);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009081 Parcel in = Parcel.obtain();
9082 in.unmarshall(raw, 0, raw.length);
9083 in.setDataPosition(0);
9084 stream.close();
9085
9086 readSummaryFromParcel(in);
Dianne Hackborn00e25212014-02-19 10:49:24 -08009087 } catch(Exception e) {
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009088 Slog.e("BatteryStats", "Error reading battery statistics", e);
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009089 resetAllStatsLocked();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009090 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009091
Dianne Hackborncd0e3352014-08-07 17:08:09 -07009092 mEndPlatformVersion = Build.ID;
9093
Dianne Hackborne5167ca2014-03-08 14:39:10 -08009094 if (mHistoryBuffer.dataPosition() > 0) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009095 mRecordingHistory = true;
Dianne Hackborn40c87252014-03-19 16:55:40 -07009096 final long elapsedRealtime = SystemClock.elapsedRealtime();
9097 final long uptime = SystemClock.uptimeMillis();
Dianne Hackborne5167ca2014-03-08 14:39:10 -08009098 if (USE_OLD_HISTORY) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009099 addHistoryRecordLocked(elapsedRealtime, uptime, HistoryItem.CMD_START, mHistoryCur);
Dianne Hackborne5167ca2014-03-08 14:39:10 -08009100 }
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009101 addHistoryBufferLocked(elapsedRealtime, uptime, HistoryItem.CMD_START, mHistoryCur);
9102 startRecordingHistory(elapsedRealtime, uptime, false);
Dianne Hackborne8c88e62011-08-17 19:09:09 -07009103 }
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08009104
9105 recordDailyStatsIfNeededLocked(false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009106 }
9107
9108 public int describeContents() {
9109 return 0;
9110 }
9111
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009112 void readHistory(Parcel in, boolean andOldHistory) throws ParcelFormatException {
Dianne Hackbornae384452011-06-28 12:33:48 -07009113 final long historyBaseTime = in.readLong();
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009114
9115 mHistoryBuffer.setDataSize(0);
9116 mHistoryBuffer.setDataPosition(0);
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08009117 mHistoryTagPool.clear();
9118 mNextHistoryTagIdx = 0;
9119 mNumHistoryTagChars = 0;
Dianne Hackborn099bc622014-01-22 13:39:16 -08009120
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08009121 int numTags = in.readInt();
9122 for (int i=0; i<numTags; i++) {
Dianne Hackborn099bc622014-01-22 13:39:16 -08009123 int idx = in.readInt();
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08009124 String str = in.readString();
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009125 if (str == null) {
9126 throw new ParcelFormatException("null history tag string");
9127 }
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08009128 int uid = in.readInt();
9129 HistoryTag tag = new HistoryTag();
9130 tag.string = str;
9131 tag.uid = uid;
9132 tag.poolIdx = idx;
9133 mHistoryTagPool.put(tag, idx);
9134 if (idx >= mNextHistoryTagIdx) {
9135 mNextHistoryTagIdx = idx+1;
Dianne Hackborn099bc622014-01-22 13:39:16 -08009136 }
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08009137 mNumHistoryTagChars += tag.string.length() + 1;
Dianne Hackborn099bc622014-01-22 13:39:16 -08009138 }
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009139
9140 int bufSize = in.readInt();
9141 int curPos = in.dataPosition();
9142 if (bufSize >= (MAX_MAX_HISTORY_BUFFER*3)) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009143 throw new ParcelFormatException("File corrupt: history data buffer too large " +
9144 bufSize);
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009145 } else if ((bufSize&~3) != bufSize) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009146 throw new ParcelFormatException("File corrupt: history data buffer not aligned " +
9147 bufSize);
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009148 } else {
9149 if (DEBUG_HISTORY) Slog.i(TAG, "***************** READING NEW HISTORY: " + bufSize
9150 + " bytes at " + curPos);
9151 mHistoryBuffer.appendFrom(in, curPos, bufSize);
9152 in.setDataPosition(curPos + bufSize);
Dianne Hackborn32907cf2010-06-10 17:50:20 -07009153 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009154
Dianne Hackbornae384452011-06-28 12:33:48 -07009155 if (andOldHistory) {
9156 readOldHistory(in);
9157 }
9158
9159 if (DEBUG_HISTORY) {
9160 StringBuilder sb = new StringBuilder(128);
9161 sb.append("****************** OLD mHistoryBaseTime: ");
9162 TimeUtils.formatDuration(mHistoryBaseTime, sb);
9163 Slog.i(TAG, sb.toString());
9164 }
9165 mHistoryBaseTime = historyBaseTime;
9166 if (DEBUG_HISTORY) {
9167 StringBuilder sb = new StringBuilder(128);
9168 sb.append("****************** NEW mHistoryBaseTime: ");
9169 TimeUtils.formatDuration(mHistoryBaseTime, sb);
9170 Slog.i(TAG, sb.toString());
9171 }
9172
9173 // We are just arbitrarily going to insert 1 minute from the sample of
9174 // the last run until samples in this run.
9175 if (mHistoryBaseTime > 0) {
9176 long oldnow = SystemClock.elapsedRealtime();
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009177 mHistoryBaseTime = mHistoryBaseTime - oldnow + 1;
Dianne Hackbornae384452011-06-28 12:33:48 -07009178 if (DEBUG_HISTORY) {
9179 StringBuilder sb = new StringBuilder(128);
9180 sb.append("****************** ADJUSTED mHistoryBaseTime: ");
9181 TimeUtils.formatDuration(mHistoryBaseTime, sb);
9182 Slog.i(TAG, sb.toString());
9183 }
Dianne Hackborn1e4b9f32010-06-23 14:10:57 -07009184 }
Dianne Hackborn32907cf2010-06-10 17:50:20 -07009185 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009186
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009187 void readOldHistory(Parcel in) {
Dianne Hackborne8c88e62011-08-17 19:09:09 -07009188 if (!USE_OLD_HISTORY) {
9189 return;
9190 }
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009191 mHistory = mHistoryEnd = mHistoryCache = null;
9192 long time;
Conley Owens5e3357f2011-05-02 09:59:30 -07009193 while (in.dataAvail() > 0 && (time=in.readLong()) >= 0) {
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009194 HistoryItem rec = new HistoryItem(time, in);
9195 addHistoryRecordLocked(rec);
9196 }
9197 }
9198
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07009199 void writeHistory(Parcel out, boolean inclData, boolean andOldHistory) {
Dianne Hackbornae384452011-06-28 12:33:48 -07009200 if (DEBUG_HISTORY) {
9201 StringBuilder sb = new StringBuilder(128);
9202 sb.append("****************** WRITING mHistoryBaseTime: ");
9203 TimeUtils.formatDuration(mHistoryBaseTime, sb);
Dianne Hackborn40c87252014-03-19 16:55:40 -07009204 sb.append(" mLastHistoryElapsedRealtime: ");
9205 TimeUtils.formatDuration(mLastHistoryElapsedRealtime, sb);
Dianne Hackbornae384452011-06-28 12:33:48 -07009206 Slog.i(TAG, sb.toString());
9207 }
Dianne Hackborn40c87252014-03-19 16:55:40 -07009208 out.writeLong(mHistoryBaseTime + mLastHistoryElapsedRealtime);
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07009209 if (!inclData) {
9210 out.writeInt(0);
9211 out.writeInt(0);
9212 return;
9213 }
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08009214 out.writeInt(mHistoryTagPool.size());
9215 for (HashMap.Entry<HistoryTag, Integer> ent : mHistoryTagPool.entrySet()) {
9216 HistoryTag tag = ent.getKey();
Dianne Hackborn099bc622014-01-22 13:39:16 -08009217 out.writeInt(ent.getValue());
Dianne Hackborn71fc13e2014-02-03 10:50:53 -08009218 out.writeString(tag.string);
9219 out.writeInt(tag.uid);
Dianne Hackborn099bc622014-01-22 13:39:16 -08009220 }
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009221 out.writeInt(mHistoryBuffer.dataSize());
9222 if (DEBUG_HISTORY) Slog.i(TAG, "***************** WRITING HISTORY: "
9223 + mHistoryBuffer.dataSize() + " bytes at " + out.dataPosition());
9224 out.appendFrom(mHistoryBuffer, 0, mHistoryBuffer.dataSize());
Dianne Hackbornae384452011-06-28 12:33:48 -07009225
9226 if (andOldHistory) {
9227 writeOldHistory(out);
9228 }
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009229 }
9230
9231 void writeOldHistory(Parcel out) {
Dianne Hackborne8c88e62011-08-17 19:09:09 -07009232 if (!USE_OLD_HISTORY) {
9233 return;
9234 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009235 HistoryItem rec = mHistory;
Dianne Hackborn32907cf2010-06-10 17:50:20 -07009236 while (rec != null) {
9237 if (rec.time >= 0) rec.writeToParcel(out, 0);
9238 rec = rec.next;
9239 }
9240 out.writeLong(-1);
9241 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009242
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009243 public void readSummaryFromParcel(Parcel in) throws ParcelFormatException {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009244 final int version = in.readInt();
9245 if (version != VERSION) {
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009246 Slog.w("BatteryStats", "readFromParcel: version got " + version
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009247 + ", expected " + VERSION + "; erasing old stats");
9248 return;
9249 }
9250
Dianne Hackbornae384452011-06-28 12:33:48 -07009251 readHistory(in, true);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009252
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009253 mStartCount = in.readInt();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009254 mUptime = in.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009255 mRealtime = in.readLong();
Dianne Hackborn5f4a5f92014-01-24 16:59:34 -08009256 mStartClockTime = in.readLong();
Dianne Hackborncd0e3352014-08-07 17:08:09 -07009257 mStartPlatformVersion = in.readString();
9258 mEndPlatformVersion = in.readString();
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009259 mOnBatteryTimeBase.readSummaryFromParcel(in);
9260 mOnBatteryScreenOffTimeBase.readSummaryFromParcel(in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009261 mDischargeUnplugLevel = in.readInt();
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07009262 mDischargePlugLevel = in.readInt();
Evan Millar633a1742009-04-02 16:36:33 -07009263 mDischargeCurrentLevel = in.readInt();
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07009264 mCurrentBatteryLevel = in.readInt();
Dianne Hackborn3bee5af82010-07-23 00:22:04 -07009265 mLowDischargeAmountSinceCharge = in.readInt();
9266 mHighDischargeAmountSinceCharge = in.readInt();
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08009267 mDischargeAmountScreenOnSinceCharge = in.readInt();
9268 mDischargeAmountScreenOffSinceCharge = in.readInt();
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08009269 mDischargeStepTracker.readFromParcel(in);
9270 mChargeStepTracker.readFromParcel(in);
9271 mDailyDischargeStepTracker.readFromParcel(in);
9272 mDailyChargeStepTracker.readFromParcel(in);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07009273 int NPKG = in.readInt();
9274 if (NPKG > 0) {
9275 mDailyPackageChanges = new ArrayList<>(NPKG);
9276 while (NPKG > 0) {
9277 NPKG--;
9278 PackageChange pc = new PackageChange();
9279 pc.mPackageName = in.readString();
9280 pc.mUpdate = in.readInt() != 0;
9281 pc.mVersionCode = in.readInt();
9282 mDailyPackageChanges.add(pc);
9283 }
9284 } else {
9285 mDailyPackageChanges = null;
9286 }
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08009287 mDailyStartTime = in.readLong();
9288 mNextMinDailyDeadline = in.readLong();
9289 mNextMaxDailyDeadline = in.readLong();
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009290
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009291 mStartCount++;
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009292
Jeff Browne95c3cd2014-05-02 16:59:26 -07009293 mScreenState = Display.STATE_UNKNOWN;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009294 mScreenOnTimer.readSummaryFromParcelLocked(in);
Dianne Hackborn617f8772009-03-31 15:04:46 -07009295 for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
9296 mScreenBrightnessTimer[i].readSummaryFromParcelLocked(in);
9297 }
Jeff Browne95c3cd2014-05-02 16:59:26 -07009298 mInteractive = false;
9299 mInteractiveTimer.readSummaryFromParcelLocked(in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009300 mPhoneOn = false;
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07009301 mPowerSaveModeEnabledTimer.readSummaryFromParcelLocked(in);
Dianne Hackborn08c47a52015-10-15 12:38:14 -07009302 mLongestLightIdleTime = in.readLong();
9303 mLongestFullIdleTime = in.readLong();
9304 mDeviceIdleModeLightTimer.readSummaryFromParcelLocked(in);
9305 mDeviceIdleModeFullTimer.readSummaryFromParcelLocked(in);
9306 mDeviceLightIdlingTimer.readSummaryFromParcelLocked(in);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07009307 mDeviceIdlingTimer.readSummaryFromParcelLocked(in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009308 mPhoneOnTimer.readSummaryFromParcelLocked(in);
Wink Saville52840902011-02-18 12:40:47 -08009309 for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
Dianne Hackborn627bba72009-03-24 22:32:56 -07009310 mPhoneSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
9311 }
Amith Yamasanif37447b2009-10-08 18:28:01 -07009312 mPhoneSignalScanningTimer.readSummaryFromParcelLocked(in);
Dianne Hackborn627bba72009-03-24 22:32:56 -07009313 for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
9314 mPhoneDataConnectionsTimer[i].readSummaryFromParcelLocked(in);
9315 }
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009316 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08009317 mNetworkByteActivityCounters[i].readSummaryFromParcelLocked(in);
9318 mNetworkPacketActivityCounters[i].readSummaryFromParcelLocked(in);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009319 }
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07009320 mMobileRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
Dianne Hackborne13c4c02014-02-11 17:18:35 -08009321 mMobileRadioActiveTimer.readSummaryFromParcelLocked(in);
Dianne Hackborn77b987f2014-02-26 16:20:52 -08009322 mMobileRadioActivePerAppTimer.readSummaryFromParcelLocked(in);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009323 mMobileRadioActiveAdjustedTime.readSummaryFromParcelLocked(in);
Dianne Hackbornd45665b2014-02-26 12:35:32 -08009324 mMobileRadioActiveUnknownTime.readSummaryFromParcelLocked(in);
9325 mMobileRadioActiveUnknownCount.readSummaryFromParcelLocked(in);
Dianne Hackborn0c820db2015-04-14 17:47:34 -07009326 mWifiRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
The Android Open Source Project10592532009-03-18 17:39:46 -07009327 mWifiOn = false;
9328 mWifiOnTimer.readSummaryFromParcelLocked(in);
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07009329 mGlobalWifiRunning = false;
9330 mGlobalWifiRunningTimer.readSummaryFromParcelLocked(in);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08009331 for (int i=0; i<NUM_WIFI_STATES; i++) {
9332 mWifiStateTimer[i].readSummaryFromParcelLocked(in);
9333 }
Dianne Hackborn3251b902014-06-20 14:40:53 -07009334 for (int i=0; i<NUM_WIFI_SUPPL_STATES; i++) {
9335 mWifiSupplStateTimer[i].readSummaryFromParcelLocked(in);
9336 }
9337 for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
9338 mWifiSignalStrengthsTimer[i].readSummaryFromParcelLocked(in);
9339 }
Adam Lesinski33dac552015-03-09 15:24:48 -07009340 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
9341 mBluetoothActivityCounters[i].readSummaryFromParcelLocked(in);
9342 }
Adam Lesinski33dac552015-03-09 15:24:48 -07009343 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
9344 mWifiActivityCounters[i].readSummaryFromParcelLocked(in);
9345 }
9346
Dianne Hackborn1e01d162014-12-04 17:46:42 -08009347 mNumConnectivityChange = mLoadedNumConnectivityChange = in.readInt();
Ruben Brunk6d2c3632015-05-26 17:32:16 -07009348 mFlashlightOnNesting = 0;
Dianne Hackbornabc7c492014-06-30 16:57:46 -07009349 mFlashlightOnTimer.readSummaryFromParcelLocked(in);
Ruben Brunk6d2c3632015-05-26 17:32:16 -07009350 mCameraOnNesting = 0;
9351 mCameraOnTimer.readSummaryFromParcelLocked(in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009352
Evan Millarc64edde2009-04-18 12:26:32 -07009353 int NKW = in.readInt();
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009354 if (NKW > 10000) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009355 throw new ParcelFormatException("File corrupt: too many kernel wake locks " + NKW);
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009356 }
Evan Millarc64edde2009-04-18 12:26:32 -07009357 for (int ikw = 0; ikw < NKW; ikw++) {
9358 if (in.readInt() != 0) {
9359 String kwltName = in.readString();
9360 getKernelWakelockTimerLocked(kwltName).readSummaryFromParcelLocked(in);
9361 }
9362 }
Amith Yamasanie43530a2009-08-21 13:11:37 -07009363
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009364 int NWR = in.readInt();
9365 if (NWR > 10000) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009366 throw new ParcelFormatException("File corrupt: too many wakeup reasons " + NWR);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009367 }
9368 for (int iwr = 0; iwr < NWR; iwr++) {
9369 if (in.readInt() != 0) {
9370 String reasonName = in.readString();
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07009371 getWakeupReasonTimerLocked(reasonName).readSummaryFromParcelLocked(in);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009372 }
9373 }
9374
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009375 final int NU = in.readInt();
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009376 if (NU > 10000) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009377 throw new ParcelFormatException("File corrupt: too many uids " + NU);
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009378 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009379 for (int iu = 0; iu < NU; iu++) {
9380 int uid = in.readInt();
9381 Uid u = new Uid(uid);
9382 mUidStats.put(uid, u);
9383
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07009384 u.mWifiRunning = false;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009385 if (in.readInt() != 0) {
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07009386 u.mWifiRunningTimer.readSummaryFromParcelLocked(in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009387 }
The Android Open Source Project10592532009-03-18 17:39:46 -07009388 u.mFullWifiLockOut = false;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009389 if (in.readInt() != 0) {
9390 u.mFullWifiLockTimer.readSummaryFromParcelLocked(in);
9391 }
Nick Pelly6ccaa542012-06-15 15:22:47 -07009392 u.mWifiScanStarted = false;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009393 if (in.readInt() != 0) {
Nick Pelly6ccaa542012-06-15 15:22:47 -07009394 u.mWifiScanTimer.readSummaryFromParcelLocked(in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009395 }
Robert Greenwalta029ea12013-09-25 16:38:12 -07009396 u.mWifiBatchedScanBinStarted = Uid.NO_BATCHED_SCAN_STARTED;
9397 for (int i = 0; i < Uid.NUM_WIFI_BATCHED_SCAN_BINS; i++) {
9398 if (in.readInt() != 0) {
9399 u.makeWifiBatchedScanBin(i, null);
9400 u.mWifiBatchedScanTimer[i].readSummaryFromParcelLocked(in);
9401 }
9402 }
Robert Greenwalt5347bd42009-05-13 15:10:16 -07009403 u.mWifiMulticastEnabled = false;
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009404 if (in.readInt() != 0) {
9405 u.mWifiMulticastTimer.readSummaryFromParcelLocked(in);
9406 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009407 if (in.readInt() != 0) {
Dianne Hackborna06de0f2012-12-11 16:34:47 -08009408 u.createAudioTurnedOnTimerLocked().readSummaryFromParcelLocked(in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009409 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009410 if (in.readInt() != 0) {
Dianne Hackborna06de0f2012-12-11 16:34:47 -08009411 u.createVideoTurnedOnTimerLocked().readSummaryFromParcelLocked(in);
9412 }
9413 if (in.readInt() != 0) {
Ruben Brunk6d2c3632015-05-26 17:32:16 -07009414 u.createFlashlightTurnedOnTimerLocked().readSummaryFromParcelLocked(in);
9415 }
9416 if (in.readInt() != 0) {
9417 u.createCameraTurnedOnTimerLocked().readSummaryFromParcelLocked(in);
9418 }
9419 if (in.readInt() != 0) {
Jeff Sharkey3e013e82013-04-25 14:48:19 -07009420 u.createForegroundActivityTimerLocked().readSummaryFromParcelLocked(in);
9421 }
Dianne Hackborn61659e52014-07-09 16:13:01 -07009422 u.mProcessState = Uid.PROCESS_STATE_NONE;
9423 for (int i = 0; i < Uid.NUM_PROCESS_STATE; i++) {
9424 if (in.readInt() != 0) {
9425 u.makeProcessState(i, null);
9426 u.mProcessStateTimer[i].readSummaryFromParcelLocked(in);
9427 }
9428 }
Jeff Sharkey3e013e82013-04-25 14:48:19 -07009429 if (in.readInt() != 0) {
Dianne Hackborna06de0f2012-12-11 16:34:47 -08009430 u.createVibratorOnTimerLocked().readSummaryFromParcelLocked(in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009431 }
Robert Greenwalt5347bd42009-05-13 15:10:16 -07009432
Dianne Hackborn617f8772009-03-31 15:04:46 -07009433 if (in.readInt() != 0) {
9434 if (u.mUserActivityCounters == null) {
9435 u.initUserActivityLocked();
9436 }
9437 for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
9438 u.mUserActivityCounters[i].readSummaryFromParcelLocked(in);
9439 }
9440 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009441
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009442 if (in.readInt() != 0) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08009443 if (u.mNetworkByteActivityCounters == null) {
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009444 u.initNetworkActivityLocked();
9445 }
9446 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08009447 u.mNetworkByteActivityCounters[i].readSummaryFromParcelLocked(in);
9448 u.mNetworkPacketActivityCounters[i].readSummaryFromParcelLocked(in);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009449 }
Dianne Hackbornd45665b2014-02-26 12:35:32 -08009450 u.mMobileRadioActiveTime.readSummaryFromParcelLocked(in);
9451 u.mMobileRadioActiveCount.readSummaryFromParcelLocked(in);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009452 }
9453
Adam Lesinski06af1fa2015-05-05 17:35:35 -07009454 u.mUserCpuTime.readSummaryFromParcelLocked(in);
9455 u.mSystemCpuTime.readSummaryFromParcelLocked(in);
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07009456 u.mCpuPower.readSummaryFromParcelLocked(in);
Adam Lesinski06af1fa2015-05-05 17:35:35 -07009457
Adam Lesinski6832f392015-09-05 18:05:40 -07009458 if (in.readInt() != 0) {
9459 final int numClusters = in.readInt();
9460 if (mPowerProfile != null && mPowerProfile.getNumCpuClusters() != numClusters) {
9461 throw new ParcelFormatException("Incompatible cpu cluster arrangement");
Adam Lesinski06af1fa2015-05-05 17:35:35 -07009462 }
Adam Lesinski6832f392015-09-05 18:05:40 -07009463
9464 u.mCpuClusterSpeed = new LongSamplingCounter[numClusters][];
9465 for (int cluster = 0; cluster < numClusters; cluster++) {
Adam Lesinski6832f392015-09-05 18:05:40 -07009466 if (in.readInt() != 0) {
Adam Lesinskia57a5402015-09-28 10:21:33 -07009467 final int NSB = in.readInt();
9468 if (mPowerProfile != null &&
9469 mPowerProfile.getNumSpeedStepsInCpuCluster(cluster) != NSB) {
9470 throw new ParcelFormatException("File corrupt: too many speed bins " +
9471 NSB);
9472 }
9473
Adam Lesinski6832f392015-09-05 18:05:40 -07009474 u.mCpuClusterSpeed[cluster] = new LongSamplingCounter[NSB];
9475 for (int speed = 0; speed < NSB; speed++) {
9476 if (in.readInt() != 0) {
9477 u.mCpuClusterSpeed[cluster][speed] = new LongSamplingCounter(
9478 mOnBatteryTimeBase);
9479 u.mCpuClusterSpeed[cluster][speed].readSummaryFromParcelLocked(in);
9480 }
9481 }
Adam Lesinskia57a5402015-09-28 10:21:33 -07009482 } else {
9483 u.mCpuClusterSpeed[cluster] = null;
Adam Lesinski6832f392015-09-05 18:05:40 -07009484 }
9485 }
9486 } else {
9487 u.mCpuClusterSpeed = null;
Adam Lesinski06af1fa2015-05-05 17:35:35 -07009488 }
9489
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009490 int NW = in.readInt();
Dianne Hackborn7b9c56f2010-12-07 11:14:53 -08009491 if (NW > 100) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009492 throw new ParcelFormatException("File corrupt: too many wake locks " + NW);
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009493 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009494 for (int iw = 0; iw < NW; iw++) {
9495 String wlName = in.readString();
Dianne Hackbornd953c532014-08-16 18:17:38 -07009496 u.readWakeSummaryFromParcelLocked(wlName, in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009497 }
9498
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009499 int NS = in.readInt();
9500 if (NS > 100) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009501 throw new ParcelFormatException("File corrupt: too many syncs " + NS);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009502 }
9503 for (int is = 0; is < NS; is++) {
9504 String name = in.readString();
Dianne Hackbornd953c532014-08-16 18:17:38 -07009505 u.readSyncSummaryFromParcelLocked(name, in);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009506 }
9507
9508 int NJ = in.readInt();
9509 if (NJ > 100) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009510 throw new ParcelFormatException("File corrupt: too many job timers " + NJ);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009511 }
9512 for (int ij = 0; ij < NJ; ij++) {
9513 String name = in.readString();
Dianne Hackbornd953c532014-08-16 18:17:38 -07009514 u.readJobSummaryFromParcelLocked(name, in);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009515 }
9516
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009517 int NP = in.readInt();
Dianne Hackborn7b9c56f2010-12-07 11:14:53 -08009518 if (NP > 1000) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009519 throw new ParcelFormatException("File corrupt: too many sensors " + NP);
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009520 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009521 for (int is = 0; is < NP; is++) {
9522 int seNumber = in.readInt();
9523 if (in.readInt() != 0) {
9524 u.getSensorTimerLocked(seNumber, true)
9525 .readSummaryFromParcelLocked(in);
9526 }
9527 }
9528
9529 NP = in.readInt();
Dianne Hackborn7b9c56f2010-12-07 11:14:53 -08009530 if (NP > 1000) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009531 throw new ParcelFormatException("File corrupt: too many processes " + NP);
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009532 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009533 for (int ip = 0; ip < NP; ip++) {
9534 String procName = in.readString();
9535 Uid.Proc p = u.getProcessStatsLocked(procName);
9536 p.mUserTime = p.mLoadedUserTime = in.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009537 p.mSystemTime = p.mLoadedSystemTime = in.readLong();
Jeff Sharkey3e013e82013-04-25 14:48:19 -07009538 p.mForegroundTime = p.mLoadedForegroundTime = in.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009539 p.mStarts = p.mLoadedStarts = in.readInt();
Dianne Hackborn1e01d162014-12-04 17:46:42 -08009540 p.mNumCrashes = p.mLoadedNumCrashes = in.readInt();
9541 p.mNumAnrs = p.mLoadedNumAnrs = in.readInt();
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009542 p.readExcessivePowerFromParcelLocked(in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009543 }
9544
9545 NP = in.readInt();
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009546 if (NP > 10000) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009547 throw new ParcelFormatException("File corrupt: too many packages " + NP);
Dianne Hackborn1afd1c92010-03-18 22:47:17 -07009548 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009549 for (int ip = 0; ip < NP; ip++) {
9550 String pkgName = in.readString();
9551 Uid.Pkg p = u.getPackageStatsLocked(pkgName);
Dianne Hackborn1e725a72015-03-24 18:23:19 -07009552 final int NWA = in.readInt();
9553 if (NWA > 1000) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009554 throw new ParcelFormatException("File corrupt: too many wakeup alarms " + NWA);
Dianne Hackborn1e725a72015-03-24 18:23:19 -07009555 }
9556 p.mWakeupAlarms.clear();
9557 for (int iwa=0; iwa<NWA; iwa++) {
9558 String tag = in.readString();
9559 Counter c = new Counter(mOnBatteryTimeBase);
9560 c.readSummaryFromParcelLocked(in);
9561 p.mWakeupAlarms.put(tag, c);
9562 }
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009563 NS = in.readInt();
Dianne Hackborn7b9c56f2010-12-07 11:14:53 -08009564 if (NS > 1000) {
Adam Lesinski9ae9cba2015-07-08 17:09:34 -07009565 throw new ParcelFormatException("File corrupt: too many services " + NS);
Dianne Hackborn7b9c56f2010-12-07 11:14:53 -08009566 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009567 for (int is = 0; is < NS; is++) {
9568 String servName = in.readString();
9569 Uid.Pkg.Serv s = u.getServiceStatsLocked(pkgName, servName);
9570 s.mStartTime = s.mLoadedStartTime = in.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009571 s.mStarts = s.mLoadedStarts = in.readInt();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009572 s.mLaunches = s.mLoadedLaunches = in.readInt();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009573 }
9574 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009575 }
9576 }
9577
9578 /**
9579 * Writes a summary of the statistics to a Parcel, in a format suitable to be written to
9580 * disk. This format does not allow a lossless round-trip.
9581 *
9582 * @param out the Parcel to be written to.
9583 */
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07009584 public void writeSummaryToParcel(Parcel out, boolean inclHistory) {
Dianne Hackborn5f4a5f92014-01-24 16:59:34 -08009585 pullPendingStateUpdatesLocked();
Dianne Hackborn0ffc9882011-04-13 18:15:56 -07009586
Dianne Hackborn7d9eefd2014-08-27 18:30:31 -07009587 // Pull the clock time. This may update the time and make a new history entry
9588 // if we had originally pulled a time before the RTC was set.
9589 long startClockTime = getStartClockTime();
9590
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009591 final long NOW_SYS = SystemClock.uptimeMillis() * 1000;
9592 final long NOWREAL_SYS = SystemClock.elapsedRealtime() * 1000;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009593
9594 out.writeInt(VERSION);
9595
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -07009596 writeHistory(out, inclHistory, true);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009597
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009598 out.writeInt(mStartCount);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009599 out.writeLong(computeUptime(NOW_SYS, STATS_SINCE_CHARGED));
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009600 out.writeLong(computeRealtime(NOWREAL_SYS, STATS_SINCE_CHARGED));
Dianne Hackborn7d9eefd2014-08-27 18:30:31 -07009601 out.writeLong(startClockTime);
Dianne Hackborncd0e3352014-08-07 17:08:09 -07009602 out.writeString(mStartPlatformVersion);
9603 out.writeString(mEndPlatformVersion);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009604 mOnBatteryTimeBase.writeSummaryToParcel(out, NOW_SYS, NOWREAL_SYS);
9605 mOnBatteryScreenOffTimeBase.writeSummaryToParcel(out, NOW_SYS, NOWREAL_SYS);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009606 out.writeInt(mDischargeUnplugLevel);
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07009607 out.writeInt(mDischargePlugLevel);
Evan Millar633a1742009-04-02 16:36:33 -07009608 out.writeInt(mDischargeCurrentLevel);
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07009609 out.writeInt(mCurrentBatteryLevel);
Dianne Hackborne4a59512010-12-07 11:08:07 -08009610 out.writeInt(getLowDischargeAmountSinceCharge());
9611 out.writeInt(getHighDischargeAmountSinceCharge());
Dianne Hackbornc1b40e32011-01-05 18:27:40 -08009612 out.writeInt(getDischargeAmountScreenOnSinceCharge());
9613 out.writeInt(getDischargeAmountScreenOffSinceCharge());
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08009614 mDischargeStepTracker.writeToParcel(out);
9615 mChargeStepTracker.writeToParcel(out);
9616 mDailyDischargeStepTracker.writeToParcel(out);
9617 mDailyChargeStepTracker.writeToParcel(out);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07009618 if (mDailyPackageChanges != null) {
9619 final int NPKG = mDailyPackageChanges.size();
9620 out.writeInt(NPKG);
9621 for (int i=0; i<NPKG; i++) {
9622 PackageChange pc = mDailyPackageChanges.get(i);
9623 out.writeString(pc.mPackageName);
9624 out.writeInt(pc.mUpdate ? 1 : 0);
9625 out.writeInt(pc.mVersionCode);
9626 }
9627 } else {
9628 out.writeInt(0);
9629 }
Dianne Hackbornd4a8af72015-03-03 10:06:15 -08009630 out.writeLong(mDailyStartTime);
9631 out.writeLong(mNextMinDailyDeadline);
9632 out.writeLong(mNextMaxDailyDeadline);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009633
9634 mScreenOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn617f8772009-03-31 15:04:46 -07009635 for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009636 mScreenBrightnessTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn617f8772009-03-31 15:04:46 -07009637 }
Jeff Browne95c3cd2014-05-02 16:59:26 -07009638 mInteractiveTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07009639 mPowerSaveModeEnabledTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn08c47a52015-10-15 12:38:14 -07009640 out.writeLong(mLongestLightIdleTime);
9641 out.writeLong(mLongestFullIdleTime);
9642 mDeviceIdleModeLightTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9643 mDeviceIdleModeFullTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9644 mDeviceLightIdlingTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07009645 mDeviceIdlingTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009646 mPhoneOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Wink Saville52840902011-02-18 12:40:47 -08009647 for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009648 mPhoneSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn627bba72009-03-24 22:32:56 -07009649 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009650 mPhoneSignalScanningTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn627bba72009-03-24 22:32:56 -07009651 for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009652 mPhoneDataConnectionsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn627bba72009-03-24 22:32:56 -07009653 }
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009654 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08009655 mNetworkByteActivityCounters[i].writeSummaryFromParcelLocked(out);
9656 mNetworkPacketActivityCounters[i].writeSummaryFromParcelLocked(out);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009657 }
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009658 mMobileRadioActiveTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9659 mMobileRadioActivePerAppTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009660 mMobileRadioActiveAdjustedTime.writeSummaryFromParcelLocked(out);
Dianne Hackbornd45665b2014-02-26 12:35:32 -08009661 mMobileRadioActiveUnknownTime.writeSummaryFromParcelLocked(out);
9662 mMobileRadioActiveUnknownCount.writeSummaryFromParcelLocked(out);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009663 mWifiOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9664 mGlobalWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08009665 for (int i=0; i<NUM_WIFI_STATES; i++) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009666 mWifiStateTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackbornca1bf212014-02-14 14:18:36 -08009667 }
Dianne Hackborn3251b902014-06-20 14:40:53 -07009668 for (int i=0; i<NUM_WIFI_SUPPL_STATES; i++) {
9669 mWifiSupplStateTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9670 }
9671 for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
9672 mWifiSignalStrengthsTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9673 }
Adam Lesinski33dac552015-03-09 15:24:48 -07009674 for (int i=0; i< NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
9675 mBluetoothActivityCounters[i].writeSummaryFromParcelLocked(out);
9676 }
9677 for (int i=0; i< NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
9678 mWifiActivityCounters[i].writeSummaryFromParcelLocked(out);
9679 }
Dianne Hackborn1e01d162014-12-04 17:46:42 -08009680 out.writeInt(mNumConnectivityChange);
Dianne Hackbornabc7c492014-06-30 16:57:46 -07009681 mFlashlightOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Ruben Brunk6d2c3632015-05-26 17:32:16 -07009682 mCameraOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009683
Evan Millarc64edde2009-04-18 12:26:32 -07009684 out.writeInt(mKernelWakelockStats.size());
9685 for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
9686 Timer kwlt = ent.getValue();
9687 if (kwlt != null) {
9688 out.writeInt(1);
9689 out.writeString(ent.getKey());
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009690 kwlt.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9691 } else {
9692 out.writeInt(0);
9693 }
9694 }
9695
9696 out.writeInt(mWakeupReasonStats.size());
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07009697 for (Map.Entry<String, SamplingTimer> ent : mWakeupReasonStats.entrySet()) {
9698 SamplingTimer timer = ent.getValue();
9699 if (timer != null) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -07009700 out.writeInt(1);
9701 out.writeString(ent.getKey());
Dianne Hackbornc3940bc2014-09-05 15:50:25 -07009702 timer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Evan Millarc64edde2009-04-18 12:26:32 -07009703 } else {
9704 out.writeInt(0);
9705 }
9706 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009707
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009708 final int NU = mUidStats.size();
9709 out.writeInt(NU);
9710 for (int iu = 0; iu < NU; iu++) {
9711 out.writeInt(mUidStats.keyAt(iu));
9712 Uid u = mUidStats.valueAt(iu);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009713
Dianne Hackborn58e0eef2010-09-16 01:22:10 -07009714 if (u.mWifiRunningTimer != null) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009715 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009716 u.mWifiRunningTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009717 } else {
9718 out.writeInt(0);
9719 }
9720 if (u.mFullWifiLockTimer != null) {
9721 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009722 u.mFullWifiLockTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009723 } else {
9724 out.writeInt(0);
9725 }
Nick Pelly6ccaa542012-06-15 15:22:47 -07009726 if (u.mWifiScanTimer != null) {
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009727 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009728 u.mWifiScanTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009729 } else {
9730 out.writeInt(0);
9731 }
Robert Greenwalta029ea12013-09-25 16:38:12 -07009732 for (int i = 0; i < Uid.NUM_WIFI_BATCHED_SCAN_BINS; i++) {
9733 if (u.mWifiBatchedScanTimer[i] != null) {
9734 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009735 u.mWifiBatchedScanTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Robert Greenwalta029ea12013-09-25 16:38:12 -07009736 } else {
9737 out.writeInt(0);
9738 }
9739 }
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009740 if (u.mWifiMulticastTimer != null) {
9741 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009742 u.mWifiMulticastTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009743 } else {
9744 out.writeInt(0);
9745 }
9746 if (u.mAudioTurnedOnTimer != null) {
9747 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009748 u.mAudioTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009749 } else {
9750 out.writeInt(0);
9751 }
9752 if (u.mVideoTurnedOnTimer != null) {
9753 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009754 u.mVideoTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -07009755 } else {
9756 out.writeInt(0);
9757 }
Ruben Brunk6d2c3632015-05-26 17:32:16 -07009758 if (u.mFlashlightTurnedOnTimer != null) {
9759 out.writeInt(1);
9760 u.mFlashlightTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9761 } else {
9762 out.writeInt(0);
9763 }
9764 if (u.mCameraTurnedOnTimer != null) {
9765 out.writeInt(1);
9766 u.mCameraTurnedOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9767 } else {
9768 out.writeInt(0);
9769 }
Jeff Sharkey3e013e82013-04-25 14:48:19 -07009770 if (u.mForegroundActivityTimer != null) {
9771 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009772 u.mForegroundActivityTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Jeff Sharkey3e013e82013-04-25 14:48:19 -07009773 } else {
9774 out.writeInt(0);
9775 }
Dianne Hackborn61659e52014-07-09 16:13:01 -07009776 for (int i = 0; i < Uid.NUM_PROCESS_STATE; i++) {
9777 if (u.mProcessStateTimer[i] != null) {
9778 out.writeInt(1);
9779 u.mProcessStateTimer[i].writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9780 } else {
9781 out.writeInt(0);
9782 }
9783 }
Dianne Hackborna06de0f2012-12-11 16:34:47 -08009784 if (u.mVibratorOnTimer != null) {
9785 out.writeInt(1);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009786 u.mVibratorOnTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08009787 } else {
9788 out.writeInt(0);
9789 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009790
Dianne Hackborn617f8772009-03-31 15:04:46 -07009791 if (u.mUserActivityCounters == null) {
9792 out.writeInt(0);
9793 } else {
9794 out.writeInt(1);
9795 for (int i=0; i<Uid.NUM_USER_ACTIVITY_TYPES; i++) {
9796 u.mUserActivityCounters[i].writeSummaryFromParcelLocked(out);
9797 }
9798 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009799
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08009800 if (u.mNetworkByteActivityCounters == null) {
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009801 out.writeInt(0);
9802 } else {
9803 out.writeInt(1);
9804 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
Dianne Hackborn57ed6a62013-12-09 18:15:56 -08009805 u.mNetworkByteActivityCounters[i].writeSummaryFromParcelLocked(out);
9806 u.mNetworkPacketActivityCounters[i].writeSummaryFromParcelLocked(out);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009807 }
Dianne Hackbornd45665b2014-02-26 12:35:32 -08009808 u.mMobileRadioActiveTime.writeSummaryFromParcelLocked(out);
9809 u.mMobileRadioActiveCount.writeSummaryFromParcelLocked(out);
Jeff Sharkey7a1c3fc2013-06-04 12:29:00 -07009810 }
9811
Adam Lesinski06af1fa2015-05-05 17:35:35 -07009812 u.mUserCpuTime.writeSummaryFromParcelLocked(out);
9813 u.mSystemCpuTime.writeSummaryFromParcelLocked(out);
Adam Lesinskia7a4ccc2015-06-26 17:43:04 -07009814 u.mCpuPower.writeSummaryFromParcelLocked(out);
Adam Lesinski06af1fa2015-05-05 17:35:35 -07009815
Adam Lesinski6832f392015-09-05 18:05:40 -07009816 if (u.mCpuClusterSpeed != null) {
9817 out.writeInt(1);
9818 out.writeInt(u.mCpuClusterSpeed.length);
9819 for (LongSamplingCounter[] cpuSpeeds : u.mCpuClusterSpeed) {
9820 if (cpuSpeeds != null) {
9821 out.writeInt(1);
9822 out.writeInt(cpuSpeeds.length);
9823 for (LongSamplingCounter c : cpuSpeeds) {
9824 if (c != null) {
9825 out.writeInt(1);
9826 c.writeSummaryFromParcelLocked(out);
9827 } else {
9828 out.writeInt(0);
9829 }
9830 }
9831 } else {
9832 out.writeInt(0);
9833 }
Adam Lesinski06af1fa2015-05-05 17:35:35 -07009834 }
Adam Lesinski6832f392015-09-05 18:05:40 -07009835 } else {
9836 out.writeInt(0);
Adam Lesinski06af1fa2015-05-05 17:35:35 -07009837 }
9838
Dianne Hackbornd953c532014-08-16 18:17:38 -07009839 final ArrayMap<String, Uid.Wakelock> wakeStats = u.mWakelockStats.getMap();
9840 int NW = wakeStats.size();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009841 out.writeInt(NW);
Dianne Hackborn61659e52014-07-09 16:13:01 -07009842 for (int iw=0; iw<NW; iw++) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07009843 out.writeString(wakeStats.keyAt(iw));
9844 Uid.Wakelock wl = wakeStats.valueAt(iw);
Dianne Hackborn61659e52014-07-09 16:13:01 -07009845 if (wl.mTimerFull != null) {
9846 out.writeInt(1);
9847 wl.mTimerFull.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9848 } else {
9849 out.writeInt(0);
9850 }
9851 if (wl.mTimerPartial != null) {
9852 out.writeInt(1);
9853 wl.mTimerPartial.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9854 } else {
9855 out.writeInt(0);
9856 }
9857 if (wl.mTimerWindow != null) {
9858 out.writeInt(1);
9859 wl.mTimerWindow.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9860 } else {
9861 out.writeInt(0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009862 }
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07009863 if (wl.mTimerDraw != null) {
Adam Lesinski9425fe22015-06-19 12:02:13 -07009864 out.writeInt(1);
Jeff Brown6a8bd7b2015-06-19 15:07:51 -07009865 wl.mTimerDraw.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Adam Lesinski9425fe22015-06-19 12:02:13 -07009866 } else {
9867 out.writeInt(0);
9868 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009869 }
9870
Dianne Hackbornd953c532014-08-16 18:17:38 -07009871 final ArrayMap<String, StopwatchTimer> syncStats = u.mSyncStats.getMap();
9872 int NS = syncStats.size();
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009873 out.writeInt(NS);
9874 for (int is=0; is<NS; is++) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07009875 out.writeString(syncStats.keyAt(is));
9876 syncStats.valueAt(is).writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009877 }
9878
Dianne Hackbornd953c532014-08-16 18:17:38 -07009879 final ArrayMap<String, StopwatchTimer> jobStats = u.mJobStats.getMap();
9880 int NJ = jobStats.size();
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009881 out.writeInt(NJ);
9882 for (int ij=0; ij<NJ; ij++) {
Dianne Hackbornd953c532014-08-16 18:17:38 -07009883 out.writeString(jobStats.keyAt(ij));
9884 jobStats.valueAt(ij).writeSummaryFromParcelLocked(out, NOWREAL_SYS);
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009885 }
9886
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009887 int NSE = u.mSensorStats.size();
9888 out.writeInt(NSE);
Dianne Hackborn61659e52014-07-09 16:13:01 -07009889 for (int ise=0; ise<NSE; ise++) {
9890 out.writeInt(u.mSensorStats.keyAt(ise));
9891 Uid.Sensor se = u.mSensorStats.valueAt(ise);
9892 if (se.mTimer != null) {
9893 out.writeInt(1);
9894 se.mTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
9895 } else {
9896 out.writeInt(0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009897 }
9898 }
9899
9900 int NP = u.mProcessStats.size();
9901 out.writeInt(NP);
Dianne Hackborn61659e52014-07-09 16:13:01 -07009902 for (int ip=0; ip<NP; ip++) {
9903 out.writeString(u.mProcessStats.keyAt(ip));
9904 Uid.Proc ps = u.mProcessStats.valueAt(ip);
9905 out.writeLong(ps.mUserTime);
9906 out.writeLong(ps.mSystemTime);
9907 out.writeLong(ps.mForegroundTime);
9908 out.writeInt(ps.mStarts);
Dianne Hackborn1e01d162014-12-04 17:46:42 -08009909 out.writeInt(ps.mNumCrashes);
9910 out.writeInt(ps.mNumAnrs);
Dianne Hackborn61659e52014-07-09 16:13:01 -07009911 ps.writeExcessivePowerToParcelLocked(out);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009912 }
9913
9914 NP = u.mPackageStats.size();
9915 out.writeInt(NP);
9916 if (NP > 0) {
9917 for (Map.Entry<String, BatteryStatsImpl.Uid.Pkg> ent
9918 : u.mPackageStats.entrySet()) {
9919 out.writeString(ent.getKey());
9920 Uid.Pkg ps = ent.getValue();
Dianne Hackborn1e725a72015-03-24 18:23:19 -07009921 final int NWA = ps.mWakeupAlarms.size();
9922 out.writeInt(NWA);
9923 for (int iwa=0; iwa<NWA; iwa++) {
9924 out.writeString(ps.mWakeupAlarms.keyAt(iwa));
9925 ps.mWakeupAlarms.valueAt(iwa).writeSummaryFromParcelLocked(out);
9926 }
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009927 NS = ps.mServiceStats.size();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009928 out.writeInt(NS);
Dianne Hackborn1e725a72015-03-24 18:23:19 -07009929 for (int is=0; is<NS; is++) {
9930 out.writeString(ps.mServiceStats.keyAt(is));
9931 BatteryStatsImpl.Uid.Pkg.Serv ss = ps.mServiceStats.valueAt(is);
9932 long time = ss.getStartTimeToNowLocked(
9933 mOnBatteryTimeBase.getUptime(NOW_SYS));
9934 out.writeLong(time);
9935 out.writeInt(ss.mStarts);
9936 out.writeInt(ss.mLaunches);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009937 }
9938 }
9939 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009940 }
9941 }
9942
9943 public void readFromParcel(Parcel in) {
9944 readFromParcelLocked(in);
9945 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009946
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009947 void readFromParcelLocked(Parcel in) {
9948 int magic = in.readInt();
9949 if (magic != MAGIC) {
Dianne Hackbornfdb19562014-07-11 16:03:36 -07009950 throw new ParcelFormatException("Bad magic number: #" + Integer.toHexString(magic));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009951 }
9952
Dianne Hackbornae384452011-06-28 12:33:48 -07009953 readHistory(in, false);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -07009954
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009955 mStartCount = in.readInt();
Dianne Hackborn5f4a5f92014-01-24 16:59:34 -08009956 mStartClockTime = in.readLong();
Dianne Hackborncd0e3352014-08-07 17:08:09 -07009957 mStartPlatformVersion = in.readString();
9958 mEndPlatformVersion = in.readString();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009959 mUptime = in.readLong();
9960 mUptimeStart = in.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009961 mRealtime = in.readLong();
9962 mRealtimeStart = in.readLong();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08009963 mOnBattery = in.readInt() != 0;
9964 mOnBatteryInternal = false; // we are no longer really running.
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009965 mOnBatteryTimeBase.readFromParcel(in);
9966 mOnBatteryScreenOffTimeBase.readFromParcel(in);
9967
Jeff Browne95c3cd2014-05-02 16:59:26 -07009968 mScreenState = Display.STATE_UNKNOWN;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009969 mScreenOnTimer = new StopwatchTimer(null, -1, null, mOnBatteryTimeBase, in);
9970 for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
9971 mScreenBrightnessTimer[i] = new StopwatchTimer(null, -100-i, null, mOnBatteryTimeBase,
9972 in);
9973 }
Dianne Hackborn29325132014-05-21 15:01:03 -07009974 mInteractive = false;
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07009975 mInteractiveTimer = new StopwatchTimer(null, -10, null, mOnBatteryTimeBase, in);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009976 mPhoneOn = false;
Dianne Hackborn8ad2af72015-03-17 17:00:24 -07009977 mPowerSaveModeEnabledTimer = new StopwatchTimer(null, -2, null, mOnBatteryTimeBase, in);
Dianne Hackborn08c47a52015-10-15 12:38:14 -07009978 mLongestLightIdleTime = in.readLong();
9979 mLongestFullIdleTime = in.readLong();
9980 mDeviceIdleModeLightTimer = new StopwatchTimer(null, -14, null, mOnBatteryTimeBase, in);
9981 mDeviceIdleModeFullTimer = new StopwatchTimer(null, -11, null, mOnBatteryTimeBase, in);
9982 mDeviceLightIdlingTimer = new StopwatchTimer(null, -15, null, mOnBatteryTimeBase, in);
Dianne Hackborn88e98df2015-03-23 13:29:14 -07009983 mDeviceIdlingTimer = new StopwatchTimer(null, -12, null, mOnBatteryTimeBase, in);
Dianne Hackborncbefd8d2014-05-14 11:42:00 -07009984 mPhoneOnTimer = new StopwatchTimer(null, -3, null, mOnBatteryTimeBase, in);
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009985 for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
9986 mPhoneSignalStrengthsTimer[i] = new StopwatchTimer(null, -200-i,
9987 null, mOnBatteryTimeBase, in);
9988 }
9989 mPhoneSignalScanningTimer = new StopwatchTimer(null, -200+1, null, mOnBatteryTimeBase, in);
9990 for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
9991 mPhoneDataConnectionsTimer[i] = new StopwatchTimer(null, -300-i,
9992 null, mOnBatteryTimeBase, in);
9993 }
9994 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
9995 mNetworkByteActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase, in);
9996 mNetworkPacketActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase, in);
9997 }
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -07009998 mMobileRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
Dianne Hackborn97ae5382014-03-05 16:43:25 -08009999 mMobileRadioActiveTimer = new StopwatchTimer(null, -400, null, mOnBatteryTimeBase, in);
10000 mMobileRadioActivePerAppTimer = new StopwatchTimer(null, -401, null, mOnBatteryTimeBase,
10001 in);
Dianne Hackborna1bd7922014-03-21 11:07:11 -070010002 mMobileRadioActiveAdjustedTime = new LongSamplingCounter(mOnBatteryTimeBase, in);
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010003 mMobileRadioActiveUnknownTime = new LongSamplingCounter(mOnBatteryTimeBase, in);
10004 mMobileRadioActiveUnknownCount = new LongSamplingCounter(mOnBatteryTimeBase, in);
Dianne Hackborn0c820db2015-04-14 17:47:34 -070010005 mWifiRadioPowerState = DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010006 mWifiOn = false;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -070010007 mWifiOnTimer = new StopwatchTimer(null, -4, null, mOnBatteryTimeBase, in);
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010008 mGlobalWifiRunning = false;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -070010009 mGlobalWifiRunningTimer = new StopwatchTimer(null, -5, null, mOnBatteryTimeBase, in);
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010010 for (int i=0; i<NUM_WIFI_STATES; i++) {
10011 mWifiStateTimer[i] = new StopwatchTimer(null, -600-i,
10012 null, mOnBatteryTimeBase, in);
10013 }
Dianne Hackborn3251b902014-06-20 14:40:53 -070010014 for (int i=0; i<NUM_WIFI_SUPPL_STATES; i++) {
10015 mWifiSupplStateTimer[i] = new StopwatchTimer(null, -700-i,
10016 null, mOnBatteryTimeBase, in);
10017 }
10018 for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
10019 mWifiSignalStrengthsTimer[i] = new StopwatchTimer(null, -800-i,
10020 null, mOnBatteryTimeBase, in);
10021 }
Adam Lesinski33dac552015-03-09 15:24:48 -070010022 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
10023 mBluetoothActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase, in);
10024 }
Adam Lesinski33dac552015-03-09 15:24:48 -070010025 for (int i = 0; i < NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
10026 mWifiActivityCounters[i] = new LongSamplingCounter(mOnBatteryTimeBase, in);
10027 }
10028
Adam Lesinski17390762015-04-10 13:17:47 -070010029 mHasWifiEnergyReporting = in.readInt() != 0;
10030 mHasBluetoothEnergyReporting = in.readInt() != 0;
Dianne Hackborn1e01d162014-12-04 17:46:42 -080010031 mNumConnectivityChange = in.readInt();
10032 mLoadedNumConnectivityChange = in.readInt();
10033 mUnpluggedNumConnectivityChange = in.readInt();
Dianne Hackborn10eaa852014-07-22 22:54:55 -070010034 mAudioOnNesting = 0;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -070010035 mAudioOnTimer = new StopwatchTimer(null, -7, null, mOnBatteryTimeBase);
Dianne Hackborn10eaa852014-07-22 22:54:55 -070010036 mVideoOnNesting = 0;
Dianne Hackborncbefd8d2014-05-14 11:42:00 -070010037 mVideoOnTimer = new StopwatchTimer(null, -8, null, mOnBatteryTimeBase);
Ruben Brunk6d2c3632015-05-26 17:32:16 -070010038 mFlashlightOnNesting = 0;
Dianne Hackbornabc7c492014-06-30 16:57:46 -070010039 mFlashlightOnTimer = new StopwatchTimer(null, -9, null, mOnBatteryTimeBase, in);
Ruben Brunk6d2c3632015-05-26 17:32:16 -070010040 mCameraOnNesting = 0;
10041 mCameraOnTimer = new StopwatchTimer(null, -13, null, mOnBatteryTimeBase, in);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -070010042 mDischargeUnplugLevel = in.readInt();
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -070010043 mDischargePlugLevel = in.readInt();
Evan Millar633a1742009-04-02 16:36:33 -070010044 mDischargeCurrentLevel = in.readInt();
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -070010045 mCurrentBatteryLevel = in.readInt();
Dianne Hackborn3bee5af82010-07-23 00:22:04 -070010046 mLowDischargeAmountSinceCharge = in.readInt();
10047 mHighDischargeAmountSinceCharge = in.readInt();
Dianne Hackbornc1b40e32011-01-05 18:27:40 -080010048 mDischargeAmountScreenOn = in.readInt();
10049 mDischargeAmountScreenOnSinceCharge = in.readInt();
10050 mDischargeAmountScreenOff = in.readInt();
10051 mDischargeAmountScreenOffSinceCharge = in.readInt();
Dianne Hackbornd4a8af72015-03-03 10:06:15 -080010052 mDischargeStepTracker.readFromParcel(in);
10053 mChargeStepTracker.readFromParcel(in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010054 mLastWriteTime = in.readLong();
10055
Evan Millarc64edde2009-04-18 12:26:32 -070010056 mKernelWakelockStats.clear();
10057 int NKW = in.readInt();
10058 for (int ikw = 0; ikw < NKW; ikw++) {
10059 if (in.readInt() != 0) {
10060 String wakelockName = in.readString();
Dianne Hackbornc3940bc2014-09-05 15:50:25 -070010061 SamplingTimer kwlt = new SamplingTimer(mOnBatteryScreenOffTimeBase, in);
Evan Millarc64edde2009-04-18 12:26:32 -070010062 mKernelWakelockStats.put(wakelockName, kwlt);
10063 }
10064 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -070010065
Dianne Hackborna1bd7922014-03-21 11:07:11 -070010066 mWakeupReasonStats.clear();
10067 int NWR = in.readInt();
10068 for (int iwr = 0; iwr < NWR; iwr++) {
10069 if (in.readInt() != 0) {
10070 String reasonName = in.readString();
Dianne Hackbornc3940bc2014-09-05 15:50:25 -070010071 SamplingTimer timer = new SamplingTimer(mOnBatteryTimeBase, in);
10072 mWakeupReasonStats.put(reasonName, timer);
Dianne Hackborna1bd7922014-03-21 11:07:11 -070010073 }
10074 }
10075
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010076 mPartialTimers.clear();
10077 mFullTimers.clear();
10078 mWindowTimers.clear();
Dianne Hackborn58e0eef2010-09-16 01:22:10 -070010079 mWifiRunningTimers.clear();
10080 mFullWifiLockTimers.clear();
Nick Pelly6ccaa542012-06-15 15:22:47 -070010081 mWifiScanTimers.clear();
Robert Greenwalta029ea12013-09-25 16:38:12 -070010082 mWifiBatchedScanTimers.clear();
Dianne Hackborn58e0eef2010-09-16 01:22:10 -070010083 mWifiMulticastTimers.clear();
Dianne Hackborn10eaa852014-07-22 22:54:55 -070010084 mAudioTurnedOnTimers.clear();
10085 mVideoTurnedOnTimers.clear();
Ruben Brunk6d2c3632015-05-26 17:32:16 -070010086 mFlashlightTurnedOnTimers.clear();
10087 mCameraTurnedOnTimers.clear();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010088
10089 int numUids = in.readInt();
10090 mUidStats.clear();
10091 for (int i = 0; i < numUids; i++) {
10092 int uid = in.readInt();
10093 Uid u = new Uid(uid);
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010094 u.readFromParcelLocked(mOnBatteryTimeBase, mOnBatteryScreenOffTimeBase, in);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010095 mUidStats.append(uid, u);
10096 }
10097 }
10098
10099 public void writeToParcel(Parcel out, int flags) {
Dianne Hackborn3bee5af82010-07-23 00:22:04 -070010100 writeToParcelLocked(out, true, flags);
10101 }
10102
10103 public void writeToParcelWithoutUids(Parcel out, int flags) {
10104 writeToParcelLocked(out, false, flags);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010105 }
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -070010106
10107 @SuppressWarnings("unused")
Dianne Hackborn3bee5af82010-07-23 00:22:04 -070010108 void writeToParcelLocked(Parcel out, boolean inclUids, int flags) {
Dianne Hackborn0ffc9882011-04-13 18:15:56 -070010109 // Need to update with current kernel wake lock counts.
Dianne Hackborna7c837f2014-01-15 16:20:44 -080010110 pullPendingStateUpdatesLocked();
Dianne Hackborn0ffc9882011-04-13 18:15:56 -070010111
Dianne Hackborn7d9eefd2014-08-27 18:30:31 -070010112 // Pull the clock time. This may update the time and make a new history entry
10113 // if we had originally pulled a time before the RTC was set.
10114 long startClockTime = getStartClockTime();
10115
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010116 final long uSecUptime = SystemClock.uptimeMillis() * 1000;
10117 final long uSecRealtime = SystemClock.elapsedRealtime() * 1000;
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010118 final long batteryRealtime = mOnBatteryTimeBase.getRealtime(uSecRealtime);
10119 final long batteryScreenOffRealtime = mOnBatteryScreenOffTimeBase.getRealtime(uSecRealtime);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -070010120
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010121 out.writeInt(MAGIC);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -070010122
Dianne Hackborn0068d3dc2014-08-06 19:20:25 -070010123 writeHistory(out, true, false);
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -070010124
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010125 out.writeInt(mStartCount);
Dianne Hackborn7d9eefd2014-08-27 18:30:31 -070010126 out.writeLong(startClockTime);
Dianne Hackborncd0e3352014-08-07 17:08:09 -070010127 out.writeString(mStartPlatformVersion);
10128 out.writeString(mEndPlatformVersion);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010129 out.writeLong(mUptime);
10130 out.writeLong(mUptimeStart);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010131 out.writeLong(mRealtime);
10132 out.writeLong(mRealtimeStart);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010133 out.writeInt(mOnBattery ? 1 : 0);
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010134 mOnBatteryTimeBase.writeToParcel(out, uSecUptime, uSecRealtime);
10135 mOnBatteryScreenOffTimeBase.writeToParcel(out, uSecUptime, uSecRealtime);
10136
10137 mScreenOnTimer.writeToParcel(out, uSecRealtime);
10138 for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
10139 mScreenBrightnessTimer[i].writeToParcel(out, uSecRealtime);
10140 }
Jeff Browne95c3cd2014-05-02 16:59:26 -070010141 mInteractiveTimer.writeToParcel(out, uSecRealtime);
Dianne Hackborn8ad2af72015-03-17 17:00:24 -070010142 mPowerSaveModeEnabledTimer.writeToParcel(out, uSecRealtime);
Dianne Hackborn08c47a52015-10-15 12:38:14 -070010143 out.writeLong(mLongestLightIdleTime);
10144 out.writeLong(mLongestFullIdleTime);
10145 mDeviceIdleModeLightTimer.writeToParcel(out, uSecRealtime);
10146 mDeviceIdleModeFullTimer.writeToParcel(out, uSecRealtime);
10147 mDeviceLightIdlingTimer.writeToParcel(out, uSecRealtime);
Dianne Hackborn88e98df2015-03-23 13:29:14 -070010148 mDeviceIdlingTimer.writeToParcel(out, uSecRealtime);
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010149 mPhoneOnTimer.writeToParcel(out, uSecRealtime);
10150 for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
10151 mPhoneSignalStrengthsTimer[i].writeToParcel(out, uSecRealtime);
10152 }
10153 mPhoneSignalScanningTimer.writeToParcel(out, uSecRealtime);
10154 for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
10155 mPhoneDataConnectionsTimer[i].writeToParcel(out, uSecRealtime);
10156 }
10157 for (int i = 0; i < NUM_NETWORK_ACTIVITY_TYPES; i++) {
10158 mNetworkByteActivityCounters[i].writeToParcel(out);
10159 mNetworkPacketActivityCounters[i].writeToParcel(out);
10160 }
10161 mMobileRadioActiveTimer.writeToParcel(out, uSecRealtime);
10162 mMobileRadioActivePerAppTimer.writeToParcel(out, uSecRealtime);
Dianne Hackborna1bd7922014-03-21 11:07:11 -070010163 mMobileRadioActiveAdjustedTime.writeToParcel(out);
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010164 mMobileRadioActiveUnknownTime.writeToParcel(out);
10165 mMobileRadioActiveUnknownCount.writeToParcel(out);
10166 mWifiOnTimer.writeToParcel(out, uSecRealtime);
10167 mGlobalWifiRunningTimer.writeToParcel(out, uSecRealtime);
10168 for (int i=0; i<NUM_WIFI_STATES; i++) {
10169 mWifiStateTimer[i].writeToParcel(out, uSecRealtime);
10170 }
Dianne Hackborn3251b902014-06-20 14:40:53 -070010171 for (int i=0; i<NUM_WIFI_SUPPL_STATES; i++) {
10172 mWifiSupplStateTimer[i].writeToParcel(out, uSecRealtime);
10173 }
10174 for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
10175 mWifiSignalStrengthsTimer[i].writeToParcel(out, uSecRealtime);
10176 }
Adam Lesinski33dac552015-03-09 15:24:48 -070010177 for (int i=0; i< NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
10178 mBluetoothActivityCounters[i].writeToParcel(out);
10179 }
10180 for (int i=0; i< NUM_CONTROLLER_ACTIVITY_TYPES; i++) {
10181 mWifiActivityCounters[i].writeToParcel(out);
10182 }
Adam Lesinski17390762015-04-10 13:17:47 -070010183 out.writeInt(mHasWifiEnergyReporting ? 1 : 0);
10184 out.writeInt(mHasBluetoothEnergyReporting ? 1 : 0);
Dianne Hackborn1e01d162014-12-04 17:46:42 -080010185 out.writeInt(mNumConnectivityChange);
10186 out.writeInt(mLoadedNumConnectivityChange);
10187 out.writeInt(mUnpluggedNumConnectivityChange);
Dianne Hackbornabc7c492014-06-30 16:57:46 -070010188 mFlashlightOnTimer.writeToParcel(out, uSecRealtime);
Ruben Brunk6d2c3632015-05-26 17:32:16 -070010189 mCameraOnTimer.writeToParcel(out, uSecRealtime);
Dianne Hackborn6b7b4842010-06-14 17:17:44 -070010190 out.writeInt(mDischargeUnplugLevel);
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -070010191 out.writeInt(mDischargePlugLevel);
Evan Millar633a1742009-04-02 16:36:33 -070010192 out.writeInt(mDischargeCurrentLevel);
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -070010193 out.writeInt(mCurrentBatteryLevel);
Dianne Hackborn3bee5af82010-07-23 00:22:04 -070010194 out.writeInt(mLowDischargeAmountSinceCharge);
10195 out.writeInt(mHighDischargeAmountSinceCharge);
Dianne Hackbornc1b40e32011-01-05 18:27:40 -080010196 out.writeInt(mDischargeAmountScreenOn);
10197 out.writeInt(mDischargeAmountScreenOnSinceCharge);
10198 out.writeInt(mDischargeAmountScreenOff);
10199 out.writeInt(mDischargeAmountScreenOffSinceCharge);
Dianne Hackbornd4a8af72015-03-03 10:06:15 -080010200 mDischargeStepTracker.writeToParcel(out);
10201 mChargeStepTracker.writeToParcel(out);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010202 out.writeLong(mLastWriteTime);
10203
Dianne Hackborn3bee5af82010-07-23 00:22:04 -070010204 if (inclUids) {
10205 out.writeInt(mKernelWakelockStats.size());
10206 for (Map.Entry<String, SamplingTimer> ent : mKernelWakelockStats.entrySet()) {
10207 SamplingTimer kwlt = ent.getValue();
10208 if (kwlt != null) {
10209 out.writeInt(1);
10210 out.writeString(ent.getKey());
Dianne Hackborna1bd7922014-03-21 11:07:11 -070010211 kwlt.writeToParcel(out, uSecRealtime);
10212 } else {
10213 out.writeInt(0);
10214 }
10215 }
10216 out.writeInt(mWakeupReasonStats.size());
Dianne Hackbornc3940bc2014-09-05 15:50:25 -070010217 for (Map.Entry<String, SamplingTimer> ent : mWakeupReasonStats.entrySet()) {
10218 SamplingTimer timer = ent.getValue();
10219 if (timer != null) {
Dianne Hackborna1bd7922014-03-21 11:07:11 -070010220 out.writeInt(1);
10221 out.writeString(ent.getKey());
Dianne Hackbornc3940bc2014-09-05 15:50:25 -070010222 timer.writeToParcel(out, uSecRealtime);
Dianne Hackborn3bee5af82010-07-23 00:22:04 -070010223 } else {
10224 out.writeInt(0);
10225 }
Evan Millarc64edde2009-04-18 12:26:32 -070010226 }
Dianne Hackborn3bee5af82010-07-23 00:22:04 -070010227 } else {
10228 out.writeInt(0);
Evan Millarc64edde2009-04-18 12:26:32 -070010229 }
Amith Yamasanie43530a2009-08-21 13:11:37 -070010230
Dianne Hackborn3bee5af82010-07-23 00:22:04 -070010231 if (inclUids) {
10232 int size = mUidStats.size();
10233 out.writeInt(size);
10234 for (int i = 0; i < size; i++) {
10235 out.writeInt(mUidStats.keyAt(i));
10236 Uid uid = mUidStats.valueAt(i);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010237
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010238 uid.writeToParcelLocked(out, uSecRealtime);
Dianne Hackborn3bee5af82010-07-23 00:22:04 -070010239 }
10240 } else {
10241 out.writeInt(0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010242 }
10243 }
10244
10245 public static final Parcelable.Creator<BatteryStatsImpl> CREATOR =
10246 new Parcelable.Creator<BatteryStatsImpl>() {
10247 public BatteryStatsImpl createFromParcel(Parcel in) {
10248 return new BatteryStatsImpl(in);
10249 }
10250
10251 public BatteryStatsImpl[] newArray(int size) {
10252 return new BatteryStatsImpl[size];
10253 }
10254 };
Jaikumar Ganesh5a1e4cf2010-10-18 17:05:09 -070010255
Dianne Hackborn0ffc9882011-04-13 18:15:56 -070010256 public void prepareForDumpLocked() {
10257 // Need to retrieve current kernel wake lock stats before printing.
Dianne Hackborna7c837f2014-01-15 16:20:44 -080010258 pullPendingStateUpdatesLocked();
Dianne Hackborn7d9eefd2014-08-27 18:30:31 -070010259
10260 // Pull the clock time. This may update the time and make a new history entry
10261 // if we had originally pulled a time before the RTC was set.
10262 getStartClockTime();
Dianne Hackborn0ffc9882011-04-13 18:15:56 -070010263 }
10264
Dianne Hackbornc51cf032014-03-02 19:08:15 -080010265 public void dumpLocked(Context context, PrintWriter pw, int flags, int reqUid, long histStart) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010266 if (DEBUG) {
Dianne Hackborn97ae5382014-03-05 16:43:25 -080010267 pw.println("mOnBatteryTimeBase:");
10268 mOnBatteryTimeBase.dump(pw, " ");
10269 pw.println("mOnBatteryScreenOffTimeBase:");
10270 mOnBatteryScreenOffTimeBase.dump(pw, " ");
Dianne Hackborn1d442e02009-04-20 18:14:05 -070010271 Printer pr = new PrintWriterPrinter(pw);
10272 pr.println("*** Screen timer:");
10273 mScreenOnTimer.logState(pr, " ");
Dianne Hackborn617f8772009-03-31 15:04:46 -070010274 for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
Dianne Hackborn1d442e02009-04-20 18:14:05 -070010275 pr.println("*** Screen brightness #" + i + ":");
10276 mScreenBrightnessTimer[i].logState(pr, " ");
Dianne Hackborn617f8772009-03-31 15:04:46 -070010277 }
Jeff Browne95c3cd2014-05-02 16:59:26 -070010278 pr.println("*** Interactive timer:");
10279 mInteractiveTimer.logState(pr, " ");
Dianne Hackborn8ad2af72015-03-17 17:00:24 -070010280 pr.println("*** Power save mode timer:");
10281 mPowerSaveModeEnabledTimer.logState(pr, " ");
Dianne Hackborn08c47a52015-10-15 12:38:14 -070010282 pr.println("*** Device idle mode light timer:");
10283 mDeviceIdleModeLightTimer.logState(pr, " ");
10284 pr.println("*** Device idle mode full timer:");
10285 mDeviceIdleModeFullTimer.logState(pr, " ");
10286 pr.println("*** Device light idling timer:");
10287 mDeviceLightIdlingTimer.logState(pr, " ");
Dianne Hackborn88e98df2015-03-23 13:29:14 -070010288 pr.println("*** Device idling timer:");
10289 mDeviceIdlingTimer.logState(pr, " ");
Dianne Hackborn1d442e02009-04-20 18:14:05 -070010290 pr.println("*** Phone timer:");
10291 mPhoneOnTimer.logState(pr, " ");
Wink Saville52840902011-02-18 12:40:47 -080010292 for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
Dianne Hackborn3251b902014-06-20 14:40:53 -070010293 pr.println("*** Phone signal strength #" + i + ":");
Dianne Hackborn1d442e02009-04-20 18:14:05 -070010294 mPhoneSignalStrengthsTimer[i].logState(pr, " ");
Dianne Hackborn627bba72009-03-24 22:32:56 -070010295 }
Amith Yamasanif37447b2009-10-08 18:28:01 -070010296 pr.println("*** Signal scanning :");
10297 mPhoneSignalScanningTimer.logState(pr, " ");
Dianne Hackborn627bba72009-03-24 22:32:56 -070010298 for (int i=0; i<NUM_DATA_CONNECTION_TYPES; i++) {
Dianne Hackborn1d442e02009-04-20 18:14:05 -070010299 pr.println("*** Data connection type #" + i + ":");
10300 mPhoneDataConnectionsTimer[i].logState(pr, " ");
Dianne Hackborn627bba72009-03-24 22:32:56 -070010301 }
Dianne Hackborn2ffa11e2014-04-21 15:56:18 -070010302 pr.println("*** mMobileRadioPowerState=" + mMobileRadioPowerState);
Dianne Hackborne13c4c02014-02-11 17:18:35 -080010303 pr.println("*** Mobile network active timer:");
10304 mMobileRadioActiveTimer.logState(pr, " ");
Dianne Hackborna1bd7922014-03-21 11:07:11 -070010305 pr.println("*** Mobile network active adjusted timer:");
10306 mMobileRadioActiveAdjustedTime.logState(pr, " ");
Dianne Hackborn0c820db2015-04-14 17:47:34 -070010307 pr.println("*** mWifiRadioPowerState=" + mWifiRadioPowerState);
Dianne Hackborn1d442e02009-04-20 18:14:05 -070010308 pr.println("*** Wifi timer:");
10309 mWifiOnTimer.logState(pr, " ");
10310 pr.println("*** WifiRunning timer:");
Dianne Hackborn58e0eef2010-09-16 01:22:10 -070010311 mGlobalWifiRunningTimer.logState(pr, " ");
Dianne Hackbornca1bf212014-02-14 14:18:36 -080010312 for (int i=0; i<NUM_WIFI_STATES; i++) {
10313 pr.println("*** Wifi state #" + i + ":");
10314 mWifiStateTimer[i].logState(pr, " ");
10315 }
Dianne Hackborn3251b902014-06-20 14:40:53 -070010316 for (int i=0; i<NUM_WIFI_SUPPL_STATES; i++) {
10317 pr.println("*** Wifi suppl state #" + i + ":");
10318 mWifiSupplStateTimer[i].logState(pr, " ");
10319 }
10320 for (int i=0; i<NUM_WIFI_SIGNAL_STRENGTH_BINS; i++) {
10321 pr.println("*** Wifi signal strength #" + i + ":");
10322 mWifiSignalStrengthsTimer[i].logState(pr, " ");
10323 }
Dianne Hackbornabc7c492014-06-30 16:57:46 -070010324 pr.println("*** Flashlight timer:");
10325 mFlashlightOnTimer.logState(pr, " ");
Ruben Brunk6d2c3632015-05-26 17:32:16 -070010326 pr.println("*** Camera timer:");
10327 mCameraOnTimer.logState(pr, " ");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010328 }
Dianne Hackbornc51cf032014-03-02 19:08:15 -080010329 super.dumpLocked(context, pw, flags, reqUid, histStart);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010330 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080010331}