BatteryStatsService.java revision 674c9bb2ffde84bd177fd44568d9a12b1c16dc6f
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.annotation.Nullable; 204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo; 213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothAdapter; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 23e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo; 243abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager; 254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.IWifiManager; 264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo; 2791268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 296f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Looper; 324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Message; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 340068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor; 359ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException; 36010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.os.Parcelable; 37cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 41010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.os.SynchronousResultReceiver; 42e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock; 43cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle; 447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 45713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler; 46713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter; 47713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats; 4806f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo; 4921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo; 50e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 51e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager; 5261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskiimport android.util.IntArray; 538a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 54bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinskiimport android.util.TimeUtils; 55674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani 564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy; 5732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats; 58d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper; 5932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl; 60e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile; 61cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices; 6220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinskiimport com.android.server.ServiceThread; 6332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File; 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 68515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer; 69515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer; 70515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder; 71515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction; 72515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets; 73713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays; 74e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List; 75010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport java.util.concurrent.TimeoutException; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 81cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub 8268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan implements PowerManagerInternal.LowPowerModeListener, 8368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan BatteryStatsImpl.PlatformIdleStateCallback { 84c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn static final String TAG = "BatteryStatsService"; 85c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 86010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski /** 87010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * How long to wait on an individual subsystem to return its stats. 88010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski */ 89010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000; 90010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 912078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius // There is some accuracy error in wifi reports so allow some slop in the results. 922078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius private static final long MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS = 750; 932078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius 94010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private static IBatteryStats sService; 95010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl mStats; 97010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private final BatteryStatsHandler mHandler; 98010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private Context mContext; 99010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private IWifiManager mWifiManager; 100010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private TelephonyManager mTelephony; 101010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 102010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Lock acquired when extracting data from external sources. 103010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private final Object mExternalStatsLock = new Object(); 104010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 105010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // WiFi keeps an accumulated total of stats, unlike Bluetooth. 106010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Keep the last WiFi stats so we can compute a delta. 107010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @GuardedBy("mExternalStatsLock") 108010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private WifiActivityEnergyInfo mLastInfo = 109010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski new WifiActivityEnergyInfo(0, 0, 0, new long[]{0}, 0, 0, 0); 1103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 1114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync { 1124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public static final int MSG_SYNC_EXTERNAL_STATS = 1; 1134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public static final int MSG_WRITE_TO_DISK = 2; 114010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 115a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski private int mUpdateFlags = 0; 11661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski private IntArray mUidsToRemove = new IntArray(); 1174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public BatteryStatsHandler(Looper looper) { 1194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski super(looper); 1204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 1234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void handleMessage(Message msg) { 1244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski switch (msg.what) { 1254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski case MSG_SYNC_EXTERNAL_STATS: 126a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final int updateFlags; 127a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski synchronized (this) { 128a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski removeMessages(MSG_SYNC_EXTERNAL_STATS); 129a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateFlags = mUpdateFlags; 130a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mUpdateFlags = 0; 131a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 132010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync((String)msg.obj, updateFlags); 13356d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski 13456d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski // other parts of the system could be calling into us 13556d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski // from mStats in order to report of changes. We must grab the mStats 13656d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski // lock before grabbing our own or we'll end up in a deadlock. 13756d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski synchronized (mStats) { 13856d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski synchronized (this) { 13961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski final int numUidsToRemove = mUidsToRemove.size(); 14061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski for (int i = 0; i < numUidsToRemove; i++) { 14161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mStats.removeIsolatedUidLocked(mUidsToRemove.get(i)); 14261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 14361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 14461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUidsToRemove.clear(); 14561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 1464b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski break; 1474b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski case MSG_WRITE_TO_DISK: 149010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("write", UPDATE_ALL); 1504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 1514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeAsyncLocked(); 1524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski break; 1544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 1589f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski public void scheduleSync(String reason, int updateFlags) { 15961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski synchronized (this) { 1609f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski scheduleSyncLocked(reason, updateFlags); 16161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 162a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 163a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 16461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski @Override 16561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski public void scheduleCpuSyncDueToRemovedUid(int uid) { 166a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski synchronized (this) { 16761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski scheduleSyncLocked("remove-uid", UPDATE_CPU); 16861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUidsToRemove.add(uid); 16961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 17061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 17161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski 17261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski private void scheduleSyncLocked(String reason, int updateFlags) { 17361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski if (mUpdateFlags == 0) { 17461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason)); 1754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 17661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUpdateFlags |= updateFlags; 1774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 18068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private native int getPlatformLowPowerStats(ByteBuffer outBuffer); 18168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8 18268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .newDecoder() 18368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .onMalformedInput(CodingErrorAction.REPLACE) 18468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .onUnmappableCharacter(CodingErrorAction.REPLACE) 18568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .replaceWith("?"); 18668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE); 18768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE); 18868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private static final int MAX_LOW_POWER_STATS_SIZE = 512; 18968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 19068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan @Override 19168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan public String getPlatformLowPowerStats() { 19268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan mUtf8BufferStat.clear(); 19368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan mUtf16BufferStat.clear(); 19468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan mDecoderStat.reset(); 19568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat); 19668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan if (bytesWritten < 0) { 19768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan return null; 19868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } else if (bytesWritten == 0) { 19968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan return "Empty"; 20068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } 20168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan mUtf8BufferStat.limit(bytesWritten); 20268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true); 20368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan mUtf16BufferStat.flip(); 20468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan return mUtf16BufferStat.toString(); 20568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } 20668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 2070068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsService(File systemDir, Handler handler) { 2084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Our handler here will be accessing the disk, use a different thread than 2094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // what the ActivityManagerService gave us (no I/O on that one!). 21020b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski final ServiceThread thread = new ServiceThread("batterystats-sync", 21120b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski Process.THREAD_PRIORITY_DEFAULT, true); 21220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski thread.start(); 21320b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski mHandler = new BatteryStatsHandler(thread.getLooper()); 2144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 2154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through. 21668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan mStats = new BatteryStatsImpl(systemDir, handler, mHandler, this); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void publish(Context context) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 221f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mStats.setRadioScanningTimeout(mContext.getResources().getInteger( 222f37447bad3773b62176baa837908daf6edb44273Amith Yamasani com.android.internal.R.integer.config_radioScanningTimeout) 223f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * 1000L); 224e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski mStats.setPowerProfile(new PowerProfile(context)); 2256832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder()); 2262c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 2272c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 2282c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown /** 2292c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * At the time when the constructor runs, the power manager has not yet been 2302c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * initialized. So we initialize the low power observer later. 2312c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown */ 2322c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown public void initPowerManagement() { 233010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class); 234010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski powerMgr.registerLowPowerModeObserver(this); 235010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.notePowerSaveMode(powerMgr.getLowPowerModeEnabled()); 236c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn (new WakeupReasonThread()).start(); 2372c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 2382c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 23955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn public void shutdown() { 2408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w("BatteryStats", "Writing battery stats before shutdown..."); 2414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 242010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("shutdown", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 24355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn synchronized (mStats) { 2446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.shutdownLocked(); 24555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 24620b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski 24720b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski // Shutdown the thread we made. 24820b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski mHandler.getLooper().quit(); 24955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 25055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static IBatteryStats getService() { 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25591268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = asInterface(b); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 259cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 260cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn @Override 261cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void onLowPowerModeChanged(boolean enabled) { 262cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 2638ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePowerSaveMode(enabled); 264cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 265cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 266cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current statistics object, which may be modified 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to reflect events that affect battery usage. You must lock the 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stats object before doing anything with it. 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getActiveStatistics() { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 2764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 2774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Schedules a write to disk to occur. This will cause the BatteryStatsImpl 2784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * object to update with the latest info, then write to disk. 2794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 2804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void scheduleWriteToDisk() { 2814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK); 2824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 2834b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 2842f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // These are for direct use by the activity manager... 2852f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 286b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski /** 287b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski * Remove a UID from the BatteryStats and BatteryStats' external dependencies. 288b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski */ 289b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski void removeUid(int uid) { 290b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski synchronized (mStats) { 291b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski mStats.removeUidStatsLocked(uid); 292b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 293b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 294b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski 2952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void addIsolatedUid(int isolatedUid, int appUid) { 2962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 2972f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.addIsolatedUidLocked(isolatedUid, appUid); 2982f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2992f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void removeIsolatedUid(int isolatedUid, int appUid) { 3022f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 30361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid); 3042f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3052f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3062f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3072f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void noteProcessStart(String name, int uid) { 3082f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 3092f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.noteProcessStartLocked(name, uid); 3102f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3112f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3122f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessCrash(String name, int uid) { 3141e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 3151e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessCrashLocked(name, uid); 3161e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3171e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3181e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 3191e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessAnr(String name, int uid) { 3201e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 3211e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessAnrLocked(name, uid); 3221e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3231e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3241e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 325a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteProcessFinish(String name, int uid) { 3262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 327a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteProcessFinishLocked(name, uid); 3282f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3292f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3302f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 331a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteUidProcessState(int uid, int state) { 3322f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 333a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteUidProcessStateLocked(uid, state); 3342f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3352f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3362f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3372f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // Public interface... 3382f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getStatistics() { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingPermission( 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 3428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i("foo", "SENDING BATTERY INFO:"); 3438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 345010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 3464b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 3474b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = out.marshall(); 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn public ParcelFileDescriptor getStatisticsStream() { 3550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mContext.enforceCallingPermission( 3560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn android.Manifest.permission.BATTERY_STATS, null); 3570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //Slog.i("foo", "SENDING BATTERY INFO:"); 3580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 3590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel out = Parcel.obtain(); 360010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 3614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 3624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] data = out.marshall(); 3650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn out.recycle(); 3660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 3670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return ParcelFileDescriptor.fromData(data, "battery-stats"); 3680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } catch (IOException e) { 3690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Unable to create shared memory", e); 3700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return null; 3710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3744870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn public boolean isCharging() { 3754870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn synchronized (mStats) { 3764870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn return mStats.isCharging(); 3774870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3784870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3794870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn 380ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeBatteryTimeRemaining() { 381ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 382ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime()); 383ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 384ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 385ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 386ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 387ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeChargeTimeRemaining() { 388ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 389ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime()); 390ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 391ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 392ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 393ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 394099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn public void noteEvent(int code, String name, int uid) { 395099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn enforceCallingPermission(); 396099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn synchronized (mStats) { 397099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn mStats.noteEventLocked(code, name, uid); 398099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 399099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 400099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 401fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncStart(String name, int uid) { 402fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 403fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 404fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncStartLocked(name, uid); 405fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 406fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 407fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 408fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncFinish(String name, int uid) { 409fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 410fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 411fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncFinishLocked(name, uid); 412fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 413fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 414fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 415fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobStart(String name, int uid) { 416fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 418fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobStartLocked(name, uid); 419fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 420fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 421fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 422fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobFinish(String name, int uid) { 423fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 424fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 425fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobFinishLocked(name, uid); 426fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 427fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 428fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 4291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmStart(String name, int uid) { 4301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 4311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 4321e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmStartLocked(name, uid); 4331e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4341e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4351e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 4361e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmFinish(String name, int uid) { 4371e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 4381e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 4391e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmFinishLocked(name, uid); 4401e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4411e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4421e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 443a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelock(int uid, int pid, String name, String historyName, int type, 4443d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn boolean unimportantForLogging) { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 447e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging, 44840c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 452cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 455cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeLocked(uid, pid, name, historyName, type, 456cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 460a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelockFromSource(WorkSource ws, int pid, String name, 461a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn String historyName, int type, boolean unimportantForLogging) { 4627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 464a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName, 465a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn type, unimportantForLogging); 4667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 469cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name, 470cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn String historyName, int type, WorkSource newWs, int newPid, String newName, 471e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn String newHistoryName, int newType, boolean newUnimportantForLogging) { 472e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn enforceCallingPermission(); 473e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn synchronized (mStats) { 474cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type, 475e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging); 476e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 477e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 478e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 479cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName, 480cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn int type) { 4817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 483cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type); 4847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 487d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn public void noteLongPartialWakelockStart(String name, String historyName, int uid) { 488d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn enforceCallingPermission(); 489d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn synchronized (mStats) { 490d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn mStats.noteLongPartialWakelockStart(name, historyName, uid); 491d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 492d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 493d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn 494d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn public void noteLongPartialWakelockFinish(String name, String historyName, int uid) { 495d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn enforceCallingPermission(); 496d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn synchronized (mStats) { 497d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn mStats.noteLongPartialWakelockFinish(name, historyName, uid); 498d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 499d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 500d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int uid, int sensor) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStartSensorLocked(uid, sensor); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int uid, int sensor) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStopSensorLocked(uid, sensor); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 515a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOn(int uid, long durationMillis) { 516a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 517a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 518a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOnLocked(uid, durationMillis); 519a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 520a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 521a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 522a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOff(int uid) { 523a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 524a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 525a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOffLocked(uid); 526a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 527a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 528a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStartGpsLocked(uid); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStopGpsLocked(uid); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 543e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteScreenState(int state) { 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 546e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteScreenStateLocked(state); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 550617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightness(int brightness) { 551617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 552617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 553617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteScreenBrightnessLocked(brightness); 554617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 555617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 556617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 557e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteUserActivity(int uid, int event) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 560e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteUserActivityLocked(uid, event); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 563617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 564280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn public void noteWakeUp(String reason, int reasonUid) { 565280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn enforceCallingPermission(); 566280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn synchronized (mStats) { 567280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn mStats.noteWakeUpLocked(reason, reasonUid); 568280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 569280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 570280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn 571e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteInteractive(boolean interactive) { 572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 573617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 574e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteInteractiveLocked(interactive); 575617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 576617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 577e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 5781e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn public void noteConnectivityChanged(int type, String extra) { 5791e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn enforceCallingPermission(); 5801e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 5811e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteConnectivityChangedLocked(type, extra); 5821e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 5831e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 5841e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 585fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) { 586e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn enforceCallingPermission(); 587e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn synchronized (mStats) { 588fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi mStats.noteMobileRadioPowerState(powerState, timestampNs, uid); 589e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 590e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 591e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOn() { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOnLocked(); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOff() { 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOffLocked(); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 605105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 606e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrength(SignalStrength signalStrength) { 607627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 608627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 609e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mStats.notePhoneSignalStrengthLocked(signalStrength); 610627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 611627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 612627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 613627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionState(int dataType, boolean hasData) { 614627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 615627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 616627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mStats.notePhoneDataConnectionStateLocked(dataType, hasData); 617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 61932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 620f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneState(int state) { 62132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani enforceCallingPermission(); 622e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int simState = TelephonyManager.getDefault().getSimState(); 62332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani synchronized (mStats) { 624e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mStats.notePhoneStateLocked(state, simState); 62532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 62632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 62732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 62858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOn() { 629105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 630105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 63158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOnLocked(); 632105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 634105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 63558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOff() { 636105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 637105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 63858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOffLocked(); 639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 640105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 641d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 642244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartAudio(int uid) { 643244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 644244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOnLocked(uid); 646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopAudio(int uid) { 650244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 651244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 652244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOffLocked(uid); 653244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 654244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 655244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 656244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartVideo(int uid) { 657244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 658244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 659244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOnLocked(uid); 660244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 661244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 662244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 663244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopVideo(int uid) { 664244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 665244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 666244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOffLocked(uid); 667244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 668244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 669244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 67010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetAudio() { 67110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 67210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 67310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetAudioLocked(); 67410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 67510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 67610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 67710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetVideo() { 67810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 67910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 68010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetVideoLocked(); 68110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 68210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 68310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 6846d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOn(int uid) { 685abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 686abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 6876d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOnLocked(uid); 688abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 689abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 690abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 6916d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOff(int uid) { 692abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 693abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 6946d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOffLocked(uid); 6956d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6966d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6976d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 6986d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStartCamera(int uid) { 6996d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7006d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7016d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOnLocked(uid); 7026d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7036d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7046d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7056d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStopCamera(int uid) { 7066d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7076d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7086d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOffLocked(uid); 7096d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7106d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7116d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7126d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetCamera() { 7136d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7146d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7156d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetCameraLocked(); 7166d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7176d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7186d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7196d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetFlashlight() { 7206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetFlashlightLocked(); 723abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 724abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 725abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 726e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski @Override 7275f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) { 728e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski enforceCallingPermission(); 729e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 730e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // There was a change in WiFi power state. 731e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Collect data now for the past activity. 7320c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn synchronized (mStats) { 733a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if (mStats.isOnBattery()) { 73406f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH || 73506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active" 73606f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski : "inactive"; 7379f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mHandler.scheduleSync("wifi-data: " + type, 7389f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI); 739a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 7405f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski mStats.noteWifiRadioPowerState(powerState, tsNanos, uid); 7410c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn } 742e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 743e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 74458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunning(WorkSource ws) { 745d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 746d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 74758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningLocked(ws); 748d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 749d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 750d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 75158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) { 752d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 753d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 75458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningChangedLocked(oldWs, newWs); 75558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 75658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 75758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 75858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStopped(WorkSource ws) { 75958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn enforceCallingPermission(); 76058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn synchronized (mStats) { 76158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiStoppedLocked(ws); 762d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 763d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 764d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 765ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn public void noteWifiState(int wifiState, String accessPoint) { 766ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn enforceCallingPermission(); 767ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn synchronized (mStats) { 768ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn mStats.noteWifiStateLocked(wifiState, accessPoint); 769ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 770ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 771ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn 7723251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) { 7733251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 7743251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 7753251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth); 7763251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7773251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7783251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 7793251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiRssiChanged(int newRssi) { 7803251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 7813251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 7823251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiRssiChangedLocked(newRssi); 7833251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7843251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7853251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 786105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquired(int uid) { 787105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 788105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 789105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockAcquiredLocked(uid); 790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 793105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleased(int uid) { 794105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 796105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockReleasedLocked(uid); 797105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 798105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 7996ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 8006ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStarted(int uid) { 801105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 802105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 8036ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedLocked(uid); 804105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 805105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8066ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 8076ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStopped(int uid) { 808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 8106ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedLocked(uid); 811105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8145347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabled(int uid) { 8155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 8165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 8175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastEnabledLocked(uid); 8185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabled(int uid) { 8225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 8235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 8245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastDisabledLocked(uid); 8255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSource(WorkSource ws) { 8297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockAcquiredFromSourceLocked(ws); 8327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSource(WorkSource ws) { 8367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockReleasedFromSourceLocked(ws); 8397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8426ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedFromSource(WorkSource ws) { 8437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8456ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedFromSourceLocked(ws); 8467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8496ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedFromSource(WorkSource ws) { 8507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8526ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedFromSourceLocked(ws); 8537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 856a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) { 857a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 858a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 859a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph); 860a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 861a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 862a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 863a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) { 864a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 865a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 866a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws); 867a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 868a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 869a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 8707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSource(WorkSource ws) { 8717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastEnabledFromSourceLocked(ws); 8747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 8787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSource(WorkSource ws) { 8797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastDisabledFromSourceLocked(ws); 8827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8857a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 8864b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void noteNetworkInterfaceType(String iface, int networkType) { 8871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey enforceCallingPermission(); 8881059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (mStats) { 8894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.noteNetworkInterfaceTypeLocked(iface, networkType); 8901059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 8911059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 8921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 8937a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 8947a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey public void noteNetworkStatsEnabled() { 8957a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey enforceCallingPermission(); 8967a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey synchronized (mStats) { 8977a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey mStats.noteNetworkStatsEnabledLocked(); 8987a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 8997a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 9007a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey 9018ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn @Override 90208c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) { 9038ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9048ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 90508c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid); 9068ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9078ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9088ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9098ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageInstalled(String pkgName, int versionCode) { 9108ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9118ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 9128ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageInstalledLocked(pkgName, versionCode); 9138ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9148ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9158ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9168ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageUninstalled(String pkgName) { 9178ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9188ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 9198ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageUninstalledLocked(pkgName); 9208ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9218ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9228ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9236771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski @Override 9246771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski public void noteBleScanStarted(WorkSource ws) { 9256771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski enforceCallingPermission(); 9269f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 9279f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mStats.noteBluetoothScanStartedFromSourceLocked(ws); 9289f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9296771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9306771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 9316771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski @Override 9326771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski public void noteBleScanStopped(WorkSource ws) { 9336771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski enforceCallingPermission(); 9349f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 9359f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mStats.noteBluetoothScanStoppedFromSourceLocked(ws); 9369f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9379f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9389f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski 9399f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski @Override 9409f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski public void noteResetBleScan() { 9419f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski enforceCallingPermission(); 9429f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 9439f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mStats.noteResetBluetoothScanLocked(); 9449f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9456771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9466771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 947010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 948010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteWifiControllerActivity(WifiActivityEnergyInfo info) { 949010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 950010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 951010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 952010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid wifi data given: " + info); 953010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 954010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 955010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 956010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski synchronized (mStats) { 957010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateWifiStateLocked(info); 958010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 959010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 960010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 961010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 962010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) { 963010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 964010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 965010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid bluetooth data given: " + info); 966010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 967010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 968010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 969010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski synchronized (mStats) { 970010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateBluetoothStateLocked(info); 971010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 972010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 973010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 974010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 975010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteModemControllerActivity(ModemActivityInfo info) { 976010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 977010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 978010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 979010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid modem data given: " + info); 980010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 981010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 982010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 983010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski synchronized (mStats) { 984010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), info); 985010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 986010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 987010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.isOnBattery(); 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 992d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski @Override 993d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski public void setBatteryState(final int status, final int health, final int plugType, 994041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski final int level, final int temp, final int volt, final int chargeUAh, 995041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski final int chargeFullUAh) { 996d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski enforceCallingPermission(); 997d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 998d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // BatteryService calls us here and we may update external state. It would be wrong 999d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // to block such a low level service like BatteryService on external stats like WiFi. 1000d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski mHandler.post(new Runnable() { 1001d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski @Override 1002d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski public void run() { 1003d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski synchronized (mStats) { 1004d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE; 1005d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski if (mStats.isOnBattery() == onBattery) { 1006d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // The battery state has not changed, so we don't need to sync external 1007d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // stats immediately. 1008926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt, 1009041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski chargeUAh, chargeFullUAh); 1010d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski return; 1011d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1012d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1013d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 1014d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // Sync external stats first as the battery has changed states. If we don't sync 1015d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // immediately here, we may not collect the relevant data later. 1016010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("battery-state", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 1017d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski synchronized (mStats) { 1018926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt, 1019041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski chargeUAh, chargeFullUAh); 1020d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1021d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1022d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski }); 1023633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 1024633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimeBattery(); 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimePlugged(); 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission() { 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS, 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingPid(), Binder.getCallingUid(), null); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1044c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1045c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final class WakeupReasonThread extends Thread { 1046515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static final int MAX_REASON_SIZE = 512; 1047515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharsetDecoder mDecoder; 1048515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private ByteBuffer mUtf8Buffer; 1049515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharBuffer mUtf16Buffer; 1050c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1051c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn WakeupReasonThread() { 1052c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn super("BatteryStats_wakeupReason"); 1053c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1054c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1055c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn public void run() { 1056c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND); 1057c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1058515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder = StandardCharsets.UTF_8 1059515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .newDecoder() 1060515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onMalformedInput(CodingErrorAction.REPLACE) 1061515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onUnmappableCharacter(CodingErrorAction.REPLACE) 1062515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .replaceWith("?"); 1063515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1064515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE); 1065515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE); 1066515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1067c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn try { 1068515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski String reason; 1069515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski while ((reason = waitWakeup()) != null) { 1070c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn synchronized (mStats) { 1071515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mStats.noteWakeupReasonLocked(reason); 1072c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1073c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1074c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } catch (RuntimeException e) { 1075c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Slog.e(TAG, "Failure reading wakeup reasons", e); 1076c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1077c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1078515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1079515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private String waitWakeup() { 1080515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.clear(); 1081515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.clear(); 1082515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.reset(); 1083515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1084515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski int bytesWritten = nativeWaitWakeup(mUtf8Buffer); 1085515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (bytesWritten < 0) { 1086515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return null; 1087515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } else if (bytesWritten == 0) { 1088515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return "unknown"; 1089515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1090515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1091515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Set the buffer's limit to the number of bytes written. 1092515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.limit(bytesWritten); 1093515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1094515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Decode the buffer from UTF-8 to UTF-16. 1095515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Unmappable characters will be replaced. 1096515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true); 1097515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.flip(); 1098515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1099515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Create a String from the UTF-16 buffer. 1100515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return mUtf16Buffer.toString(); 1101515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1102c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1103c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1104515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static native int nativeWaitWakeup(ByteBuffer outBuffer); 1105c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1106ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn private void dumpHelp(PrintWriter pw) { 110791268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn pw.println("Battery stats (batterystats) dump options:"); 11081e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn pw.println(" [--checkin] [--history] [--history-start] [--charged] [-c]"); 1109d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]"); 1110865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" --checkin: generate output for a checkin report; will write (and clear) the"); 1111865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" last old completed stats when they had been reset."); 11121476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato pw.println(" -c: write the current stats in checkin format."); 1113099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn pw.println(" --history: show only history data."); 1114c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --history-start <num>: show only history data starting at given time offset."); 1115c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --charged: only output data since last charged."); 1116d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --daily: only output full daily data."); 1117ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --reset: reset the stats, clearing all current data."); 1118ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --write: force write current collected stats to disk."); 1119d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --new-daily: immediately create and write new daily stats record."); 1120d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --read-daily: read-load last written daily stats."); 1121cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println(" <package.name>: optional name of package to filter output by."); 1122fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" -h: print this help text."); 1123fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println("Battery stats (batterystats) commands:"); 1124fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" enable|disable <option>"); 1125fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Enable or disable a running option. Option state is not saved across boots."); 1126fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Options are:"); 11270068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn pw.println(" full-history: include additional detailed events in battery history:"); 11281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn pw.println(" wake_lock_in, alarms and proc events"); 1129fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" no-auto-reset: don't automatically reset stats when unplugged"); 1130674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani pw.println(" pretend-screen-off: pretend the screen is off, even if screen state changes"); 1131ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 1132ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 1133cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) { 1134cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i++; 1135cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i >= args.length) { 1136cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Missing option argument for " + (enable ? "--enable" : "--disable")); 1137cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1138cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1139cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 11400068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) { 1141cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 11420068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.setRecordAllHistoryLocked(enable); 1143cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 11449a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } else if ("no-auto-reset".equals(args[i])) { 11459a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn synchronized (mStats) { 11469a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn mStats.setNoAutoReset(enable); 11479a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } 1148674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani } else if ("pretend-screen-off".equals(args[i])) { 1149674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani synchronized (mStats) { 1150674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani mStats.setPretendScreenOff(enable); 1151674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani } 1152cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else { 1153cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Unknown enable/disable option: " + args[i]); 1154cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1155cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1156cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1157cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return i; 1158cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1159cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 11604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 11633abd75ba3a981850cac43a401d0014a836559cb0Kenny Root if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 11643abd75ba3a981850cac43a401d0014a836559cb0Kenny Root != PackageManager.PERMISSION_GRANTED) { 11653abd75ba3a981850cac43a401d0014a836559cb0Kenny Root pw.println("Permission Denial: can't dump BatteryStats from from pid=" 11663abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() 11673abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + " without permission " + android.Manifest.permission.DUMP); 11683abd75ba3a981850cac43a401d0014a836559cb0Kenny Root return; 11693abd75ba3a981850cac43a401d0014a836559cb0Kenny Root } 11703abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 1171c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn int flags = 0; 11720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean useCheckinFormat = false; 11730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean isRealCheckin = false; 11740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean noOutput = false; 117516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn boolean writeData = false; 1176c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn long historyStart = -1; 1177cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn int reqUid = -1; 1178e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (args != null) { 1179c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn for (int i=0; i<args.length; i++) { 1180c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn String arg = args[i]; 1181e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ("--checkin".equals(arg)) { 11820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 11830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn isRealCheckin = true; 1184099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } else if ("--history".equals(arg)) { 1185c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1186c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--history-start".equals(arg)) { 1187c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1188c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn i++; 1189c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (i >= args.length) { 1190c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println("Missing time argument for --history-since"); 1191c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn dumpHelp(pw); 1192c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn return; 1193c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1194c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn historyStart = Long.parseLong(args[i]); 119516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn writeData = true; 119649021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn } else if ("-c".equals(arg)) { 11970068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 1198c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_INCLUDE_HISTORY; 1199c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--charged".equals(arg)) { 1200c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1201d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--daily".equals(arg)) { 1202d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn flags |= BatteryStats.DUMP_DAILY_ONLY; 1203e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("--reset".equals(arg)) { 1204e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 12053d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn mStats.resetAllStatsCmdLocked(); 1206e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pw.println("Battery stats reset."); 12070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 12100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ("--write".equals(arg)) { 1211010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 12120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn synchronized (mStats) { 12130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mStats.writeSyncLocked(); 12140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Battery stats written."); 12150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 12160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 1217d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--new-daily".equals(arg)) { 1218d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1219d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.recordDailyStatsLocked(); 1220d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("New daily stats written."); 1221d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1222d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1223d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--read-daily".equals(arg)) { 1224d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1225d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.readDailyStatsLocked(); 1226d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("Last daily stats read."); 1227d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1228d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1229fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--enable".equals(arg) || "enable".equals(arg)) { 1230cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, true); 1231cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1232cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1233cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1234cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Enabled: " + args[i]); 1235cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1236fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--disable".equals(arg) || "disable".equals(arg)) { 1237cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, false); 1238cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1239cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1240cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1241cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Disabled: " + args[i]); 1242cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1243ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } else if ("-h".equals(arg)) { 1244ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1245ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn return; 1246e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood } else if ("-a".equals(arg)) { 1247a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn flags |= BatteryStats.DUMP_VERBOSE; 1248cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else if (arg.length() > 0 && arg.charAt(0) == '-'){ 12490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Unknown option: " + arg); 1250ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1251cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1252cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else { 1253cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn // Not an option, last argument must be a package name. 1254cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn try { 1255e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey reqUid = mContext.getPackageManager().getPackageUidAsUser(arg, 1256cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn UserHandle.getCallingUserId()); 1257cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 1258cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println("Unknown package: " + arg); 1259cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn dumpHelp(pw); 1260cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1261cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1264e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 12650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (noOutput) { 12660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 126813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 126913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn long ident = Binder.clearCallingIdentity(); 127013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn try { 127113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn if (BatteryStatsHelper.checkWifiOnly(mContext)) { 127213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY; 127313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } 127413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn // Fetch data from external sources and update the BatteryStatsImpl object with them. 1275010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 127613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } finally { 127713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn Binder.restoreCallingIdentity(ident); 1278d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn } 127913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 1280ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn if (reqUid >= 0) { 1281ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // By default, if the caller is only interested in a specific package, then 1282ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // we only dump the aggregated data since charged. 12831e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) { 1284ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1285ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // Also if they are doing -c, we don't want history. 1286ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY; 1287ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 1288ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 12894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 12900068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (useCheckinFormat) { 12919cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications( 12920d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL); 12930068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (isRealCheckin) { 12940068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // For a real checkin, first we want to prefer to use the last complete checkin 12950068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // file if there is one. 12960068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn synchronized (mStats.mCheckinFile) { 12970068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (mStats.mCheckinFile.exists()) { 12980068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 12990068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] raw = mStats.mCheckinFile.readFully(); 13000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (raw != null) { 13010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel in = Parcel.obtain(); 13020068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.unmarshall(raw, 0, raw.length); 13030068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.setDataPosition(0); 13040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsImpl checkinStats = new BatteryStatsImpl( 13054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski null, mStats.mHandler, null); 13060068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.readSummaryFromParcel(in); 13070068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.recycle(); 13080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.dumpCheckinLocked(mContext, pw, apps, flags, 13090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn historyStart); 13100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.mCheckinFile.delete(); 13110068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return; 13120068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13139ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski } catch (IOException | ParcelFormatException e) { 13140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Failure reading checkin file " 13150068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn + mStats.mCheckinFile.getBaseFile(), e); 13160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13170068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13180068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13190068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 1320e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1321c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart); 132216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 132316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 132416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1325e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1326e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 1327e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1328c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart); 132916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 133016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 133116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1332e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1336010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private WifiActivityEnergyInfo extractDelta(WifiActivityEnergyInfo latest) { 1337010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long timePeriodMs = latest.mTimestamp - mLastInfo.mTimestamp; 1338010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long lastIdleMs = mLastInfo.mControllerIdleTimeMs; 1339010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long lastTxMs = mLastInfo.mControllerTxTimeMs; 1340010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long lastRxMs = mLastInfo.mControllerRxTimeMs; 1341010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long lastEnergy = mLastInfo.mControllerEnergyUsed; 1342010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1343010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // We will modify the last info object to be the delta, and store the new 1344010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // WifiActivityEnergyInfo object as our last one. 1345010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final WifiActivityEnergyInfo delta = mLastInfo; 1346010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mTimestamp = latest.getTimeStamp(); 1347010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mStackState = latest.getStackState(); 1348010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1349684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs; 1350684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs; 1351684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs; 1352684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius 1353684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius if (txTimeMs < 0 || rxTimeMs < 0) { 1354010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // The stats were reset by the WiFi system (which is why our delta is negative). 1355010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Returns the unaltered stats. 1356010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mControllerEnergyUsed = latest.mControllerEnergyUsed; 1357010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mControllerRxTimeMs = latest.mControllerRxTimeMs; 1358010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mControllerTxTimeMs = latest.mControllerTxTimeMs; 1359010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs; 1360010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta); 1361684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius } else { 1362684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius final long totalActiveTimeMs = txTimeMs + rxTimeMs; 1363684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius long maxExpectedIdleTimeMs; 1364684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius if (totalActiveTimeMs > timePeriodMs) { 13652078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius // Cap the max idle time at zero since the active time consumed the whole time 13662078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius maxExpectedIdleTimeMs = 0; 13672078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius if (totalActiveTimeMs > timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) { 13682078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius StringBuilder sb = new StringBuilder(); 13692078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append("Total Active time "); 13702078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(totalActiveTimeMs, sb); 13712078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" is longer than sample period "); 13722078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(timePeriodMs, sb); 13732078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(".\n"); 13742078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append("Previous WiFi snapshot: ").append("idle="); 13752078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(lastIdleMs, sb); 13762078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" rx="); 13772078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(lastRxMs, sb); 13782078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" tx="); 13792078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(lastTxMs, sb); 13802078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" e=").append(lastEnergy); 13812078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append("\n"); 13822078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append("Current WiFi snapshot: ").append("idle="); 13832078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb); 13842078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" rx="); 13852078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb); 13862078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" tx="); 13872078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); 13882078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" e=").append(latest.mControllerEnergyUsed); 13892078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius Slog.wtf(TAG, sb.toString()); 13902078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius } 1391684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius } else { 1392684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs; 1393684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius } 1394684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // These times seem to be the most reliable. 1395684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius delta.mControllerTxTimeMs = txTimeMs; 1396684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius delta.mControllerRxTimeMs = rxTimeMs; 1397684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // WiFi calculates the idle time as a difference from the on time and the various 1398684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // Rx + Tx times. There seems to be some missing time there because this sometimes 1399684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // becomes negative. Just cap it at 0 and ensure that it is less than the expected idle 1400684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // time from the difference in timestamps. 1401684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // b/21613534 1402684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius delta.mControllerIdleTimeMs = Math.min(maxExpectedIdleTimeMs, Math.max(0, idleTimeMs)); 1403684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy); 1404010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1405010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1406010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mLastInfo = latest; 1407010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return delta; 14084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 14094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1410010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski /** 1411010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * Helper method to extract the Parcelable controller info from a 1412010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * SynchronousResultReceiver. 1413010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski */ 1414010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private static <T extends Parcelable> T awaitControllerInfo( 1415010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Nullable SynchronousResultReceiver receiver) throws TimeoutException { 1416010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (receiver == null) { 1417010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return null; 14184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 14194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1420010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final SynchronousResultReceiver.Result result = 1421010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski receiver.awaitResult(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS); 1422010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (result.bundle != null) { 1423010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // This is the final destination for the Bundle. 1424010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski result.bundle.setDefusable(true); 1425010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1426010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final T data = result.bundle.getParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY); 1427010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (data != null) { 1428010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return data; 142921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 143021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 1431010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "no controller energy info supplied"); 143221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski return null; 143321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 143421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski 14354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 14364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates 14374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * batterystats with that information. 14384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * 14394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * We first grab a lock specific to this method, then once all the data has been collected, 14404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * we grab the mStats lock and update the data. 1441c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski * 1442c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski * @param reason The reason why this collection was requested. Useful for debugging. 1443a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski * @param updateFlags Which external stats to update. Can be a combination of 14449f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski * {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_CPU}, 14459f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski * {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_RADIO}, 14469f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski * {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_WIFI}, 14479f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski * and {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_BT}. 14484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 1449010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski void updateExternalStatsSync(final String reason, int updateFlags) { 1450010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SynchronousResultReceiver wifiReceiver = null; 1451010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SynchronousResultReceiver bluetoothReceiver = null; 1452010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SynchronousResultReceiver modemReceiver = null; 1453010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 14544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mExternalStatsLock) { 1455e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski if (mContext == null) { 1456010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Don't do any work yet. 1457e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski return; 1458e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 1459e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 14609f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) { 1461010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (mWifiManager == null) { 1462010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mWifiManager = IWifiManager.Stub.asInterface( 1463010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski ServiceManager.getService(Context.WIFI_SERVICE)); 1464010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1465a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1466010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (mWifiManager != null) { 1467010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski try { 1468010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski wifiReceiver = new SynchronousResultReceiver(); 1469010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mWifiManager.requestActivityInfo(wifiReceiver); 1470010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } catch (RemoteException e) { 1471010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Oh well. 1472010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1473010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 147421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 147521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski 14769f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) { 1477010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 1478010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (adapter != null) { 1479010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski bluetoothReceiver = new SynchronousResultReceiver(); 1480991357fe25b3addabf85b871df3f4098fc4b833bAdam Lesinski adapter.requestControllerActivityEnergyInfo(bluetoothReceiver); 1481010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1482c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski } 1483c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski 1484010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) { 1485010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (mTelephony == null) { 1486010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mTelephony = TelephonyManager.from(mContext); 14870c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn } 148872478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski 1489010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (mTelephony != null) { 1490010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski modemReceiver = new SynchronousResultReceiver(); 1491010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mTelephony.requestModemActivityInfo(modemReceiver); 1492a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1493010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1494a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1495010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski WifiActivityEnergyInfo wifiInfo = null; 1496010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski BluetoothActivityEnergyInfo bluetoothInfo = null; 1497010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski ModemActivityInfo modemInfo = null; 1498010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski try { 1499010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski wifiInfo = awaitControllerInfo(wifiReceiver); 1500010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } catch (TimeoutException e) { 1501010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.w(TAG, "Timeout reading wifi stats"); 1502010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1503010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1504010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski try { 1505010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski bluetoothInfo = awaitControllerInfo(bluetoothReceiver); 1506010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } catch (TimeoutException e) { 1507010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.w(TAG, "Timeout reading bt stats"); 1508010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1509010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1510010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski try { 1511010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski modemInfo = awaitControllerInfo(modemReceiver); 1512010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } catch (TimeoutException e) { 1513010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.w(TAG, "Timeout reading modem stats"); 1514010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1515010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1516010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski synchronized (mStats) { 1517010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.addHistoryEventLocked( 1518010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SystemClock.elapsedRealtime(), 1519010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SystemClock.uptimeMillis(), 1520010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, 1521010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski reason, 0); 1522010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1523010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateCpuTimeLocked(); 1524010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateKernelWakelocksLocked(); 15252dd7e5e3ef0a20864a5908fd8c0896776575d68aJames Carr mStats.updateKernelMemoryBandwidthLocked(); 1526010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1527010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (wifiInfo != null) { 1528010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (wifiInfo.isValid()) { 1529010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateWifiStateLocked(extractDelta(wifiInfo)); 1530010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } else { 1531010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "wifi info is invalid: " + wifiInfo); 1532010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1533a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1534a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1535010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (bluetoothInfo != null) { 1536010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (bluetoothInfo.isValid()) { 1537010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateBluetoothStateLocked(bluetoothInfo); 1538010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } else { 1539010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo); 1540010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1541a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1542a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1543010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (modemInfo != null) { 1544010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (modemInfo.isValid()) { 1545010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), 1546010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski modemInfo); 1547010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } else { 1548010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "modem info is invalid: " + modemInfo); 1549010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 155072478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski } 15514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 15524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 15534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1554713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1555713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1556713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a snapshot of the system health for a particular uid. 1557713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1558713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato @Override 1559713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato public HealthStatsParceler takeUidSnapshot(int requestUid) { 1560713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (requestUid != Binder.getCallingUid()) { 1561713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato mContext.enforceCallingOrSelfPermission( 1562713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato android.Manifest.permission.BATTERY_STATS, null); 1563713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1564713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato long ident = Binder.clearCallingIdentity(); 1565713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato try { 1566010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("get-health-stats-for-uid", 1567713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 1568713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato synchronized (mStats) { 1569713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return getHealthStatsForUidLocked(requestUid); 1570713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1571713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } catch (Exception ex) { 1572713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Slog.d(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex); 1573713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato throw ex; 1574713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } finally { 1575713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Binder.restoreCallingIdentity(ident); 1576713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1577713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1578713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1579713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1580713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a snapshot of the system health for a number of uids. 1581713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1582713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato @Override 1583713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) { 1584713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (!onlyCaller(requestUids)) { 1585713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato mContext.enforceCallingOrSelfPermission( 1586713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato android.Manifest.permission.BATTERY_STATS, null); 1587713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1588713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato long ident = Binder.clearCallingIdentity(); 1589713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato int i=-1; 1590713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato try { 1591010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("get-health-stats-for-uids", 1592713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 1593713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato synchronized (mStats) { 1594713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int N = requestUids.length; 1595713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsParceler[] results = new HealthStatsParceler[N]; 1596713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato for (i=0; i<N; i++) { 1597713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato results[i] = getHealthStatsForUidLocked(requestUids[i]); 1598713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1599713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return results; 1600713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1601713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } catch (Exception ex) { 1602713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Slog.d(TAG, "Crashed while writing for takeUidSnapshots(" 1603713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato + Arrays.toString(requestUids) + ") i=" + i, ex); 1604713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato throw ex; 1605713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } finally { 1606713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Binder.restoreCallingIdentity(ident); 1607713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1608713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1609713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1610713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1611713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Returns whether the Binder.getCallingUid is the only thing in requestUids. 1612713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1613713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato private static boolean onlyCaller(int[] requestUids) { 1614713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int caller = Binder.getCallingUid(); 1615713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int N = requestUids.length; 1616713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato for (int i=0; i<N; i++) { 1617713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (requestUids[i] != caller) { 1618713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return false; 1619713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1620713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1621713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return true; 1622713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1623713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1624713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1625713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a HealthStatsParceler for the given uid. You should probably call 1626010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * updateExternalStatsSync first. 1627713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1628713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato HealthStatsParceler getHealthStatsForUidLocked(int requestUid) { 1629713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter(); 1630713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS); 1631713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid); 1632713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (uid != null) { 1633713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato writer.writeUid(uidWriter, mStats, uid); 1634713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1635713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return new HealthStatsParceler(uidWriter); 1636713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1637713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1639