BatteryStatsService.java revision cd722084fb8c127e1798948fdad79b53a37a239c
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; 27455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.os.PowerSaveState; 2891268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 306f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Looper; 334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Message; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 350068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor; 369ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException; 37010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.os.Parcelable; 38cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 42010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.os.SynchronousResultReceiver; 43e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock; 44cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle; 457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 46713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler; 47713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter; 48713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats; 4906f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo; 5021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo; 51e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 52e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager; 5361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskiimport android.util.IntArray; 548a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 55bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinskiimport android.util.TimeUtils; 56674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani 574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy; 5832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats; 59d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper; 6032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl; 61e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile; 62cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices; 6320b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinskiimport com.android.server.ServiceThread; 64455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport com.android.server.power.BatterySaverPolicy.ServiceType; 6532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 70515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer; 71515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer; 72515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder; 73515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction; 74515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets; 75713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays; 76e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List; 77010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport java.util.concurrent.TimeoutException; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 83cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub 8468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan implements PowerManagerInternal.LowPowerModeListener, 8568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan BatteryStatsImpl.PlatformIdleStateCallback { 86c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn static final String TAG = "BatteryStatsService"; 87c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 88010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski /** 89010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * How long to wait on an individual subsystem to return its stats. 90010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski */ 91010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000; 92010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 932078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius // There is some accuracy error in wifi reports so allow some slop in the results. 942078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius private static final long MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS = 750; 952078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius 96010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private static IBatteryStats sService; 97010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl mStats; 99010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private final BatteryStatsHandler mHandler; 100010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private Context mContext; 101010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private IWifiManager mWifiManager; 102010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private TelephonyManager mTelephony; 103010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 104010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Lock acquired when extracting data from external sources. 105010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private final Object mExternalStatsLock = new Object(); 106010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 107010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // WiFi keeps an accumulated total of stats, unlike Bluetooth. 108010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Keep the last WiFi stats so we can compute a delta. 109010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @GuardedBy("mExternalStatsLock") 110010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private WifiActivityEnergyInfo mLastInfo = 111010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski new WifiActivityEnergyInfo(0, 0, 0, new long[]{0}, 0, 0, 0); 1123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 1134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync { 1144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public static final int MSG_SYNC_EXTERNAL_STATS = 1; 1154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public static final int MSG_WRITE_TO_DISK = 2; 116010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 117a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski private int mUpdateFlags = 0; 11861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski private IntArray mUidsToRemove = new IntArray(); 1194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public BatteryStatsHandler(Looper looper) { 1214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski super(looper); 1224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 1254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void handleMessage(Message msg) { 1264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski switch (msg.what) { 1274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski case MSG_SYNC_EXTERNAL_STATS: 128a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final int updateFlags; 129a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski synchronized (this) { 130a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski removeMessages(MSG_SYNC_EXTERNAL_STATS); 131a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateFlags = mUpdateFlags; 132a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mUpdateFlags = 0; 133a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 134010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync((String)msg.obj, updateFlags); 13556d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski 13656d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski // other parts of the system could be calling into us 13756d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski // from mStats in order to report of changes. We must grab the mStats 13856d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski // lock before grabbing our own or we'll end up in a deadlock. 13956d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski synchronized (mStats) { 14056d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski synchronized (this) { 14161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski final int numUidsToRemove = mUidsToRemove.size(); 14261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski for (int i = 0; i < numUidsToRemove; i++) { 14361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mStats.removeIsolatedUidLocked(mUidsToRemove.get(i)); 14461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 14561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 14661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUidsToRemove.clear(); 14761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 1484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski break; 1494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski case MSG_WRITE_TO_DISK: 151010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("write", UPDATE_ALL); 152cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "begin writeAsyncLocked"); 1534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 1544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeAsyncLocked(); 1554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 156cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end writeAsyncLocked"); 1574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski break; 1584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 1629f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski public void scheduleSync(String reason, int updateFlags) { 16361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski synchronized (this) { 1649f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski scheduleSyncLocked(reason, updateFlags); 16561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 166a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 167a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 16861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski @Override 16961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski public void scheduleCpuSyncDueToRemovedUid(int uid) { 170a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski synchronized (this) { 17161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski scheduleSyncLocked("remove-uid", UPDATE_CPU); 17261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUidsToRemove.add(uid); 17361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 17461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 17561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski 17661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski private void scheduleSyncLocked(String reason, int updateFlags) { 17761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski if (mUpdateFlags == 0) { 17861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason)); 1794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 18061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUpdateFlags |= updateFlags; 1814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1834b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 18468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private native int getPlatformLowPowerStats(ByteBuffer outBuffer); 18568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8 18668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .newDecoder() 18768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .onMalformedInput(CodingErrorAction.REPLACE) 18868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .onUnmappableCharacter(CodingErrorAction.REPLACE) 18968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .replaceWith("?"); 19068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE); 19168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE); 19268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private static final int MAX_LOW_POWER_STATS_SIZE = 512; 19368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 19468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan @Override 19568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan public String getPlatformLowPowerStats() { 196cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "begin getPlatformLowPowerStats"); 197cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski try { 198cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf8BufferStat.clear(); 199cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf16BufferStat.clear(); 200cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mDecoderStat.reset(); 201cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat); 202cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski if (bytesWritten < 0) { 203cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return null; 204cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } else if (bytesWritten == 0) { 205cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return "Empty"; 206cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } 207cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf8BufferStat.limit(bytesWritten); 208cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true); 209cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf16BufferStat.flip(); 210cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return mUtf16BufferStat.toString(); 211cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } finally { 212cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end getPlatformLowPowerStats"); 21368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } 21468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } 21568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 2160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsService(File systemDir, Handler handler) { 2174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Our handler here will be accessing the disk, use a different thread than 2184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // what the ActivityManagerService gave us (no I/O on that one!). 21920b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski final ServiceThread thread = new ServiceThread("batterystats-sync", 22020b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski Process.THREAD_PRIORITY_DEFAULT, true); 22120b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski thread.start(); 22220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski mHandler = new BatteryStatsHandler(thread.getLooper()); 2234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 2244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through. 22568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan mStats = new BatteryStatsImpl(systemDir, handler, mHandler, this); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void publish(Context context) { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 230f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mStats.setRadioScanningTimeout(mContext.getResources().getInteger( 231f37447bad3773b62176baa837908daf6edb44273Amith Yamasani com.android.internal.R.integer.config_radioScanningTimeout) 232f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * 1000L); 233e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski mStats.setPowerProfile(new PowerProfile(context)); 2346832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder()); 2352c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 2362c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 2372c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown /** 2382c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * At the time when the constructor runs, the power manager has not yet been 2392c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * initialized. So we initialize the low power observer later. 2402c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown */ 2412c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown public void initPowerManagement() { 242010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class); 243010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski powerMgr.registerLowPowerModeObserver(this); 244455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei mStats.notePowerSaveMode( 245455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei powerMgr.getLowPowerState(ServiceType.BATTERY_STATS) 246455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei .batterySaverEnabled); 247c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn (new WakeupReasonThread()).start(); 2482c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 2492c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 25055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn public void shutdown() { 2518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w("BatteryStats", "Writing battery stats before shutdown..."); 2524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 253010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("shutdown", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 25455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn synchronized (mStats) { 2556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.shutdownLocked(); 25655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 25720b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski 25820b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski // Shutdown the thread we made. 25920b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski mHandler.getLooper().quit(); 26055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 26155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static IBatteryStats getService() { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = asInterface(b); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 270cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 271cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn @Override 272455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public int getServiceType() { 273455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return ServiceType.BATTERY_STATS; 274455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 275455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 276455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei @Override 277455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public void onLowPowerModeChanged(PowerSaveState result) { 278cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 279455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei mStats.notePowerSaveMode(result.batterySaverEnabled); 280cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 281cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 282cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current statistics object, which may be modified 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to reflect events that affect battery usage. You must lock the 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stats object before doing anything with it. 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getActiveStatistics() { 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats; 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2910068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 2924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 2934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Schedules a write to disk to occur. This will cause the BatteryStatsImpl 2944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * object to update with the latest info, then write to disk. 2954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 2964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void scheduleWriteToDisk() { 2974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK); 2984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 2994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 3002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // These are for direct use by the activity manager... 3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 302b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski /** 303b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski * Remove a UID from the BatteryStats and BatteryStats' external dependencies. 304b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski */ 305b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski void removeUid(int uid) { 306b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski synchronized (mStats) { 307b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski mStats.removeUidStatsLocked(uid); 308b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 309b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 310b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski 3112f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void addIsolatedUid(int isolatedUid, int appUid) { 3122f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 3132f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.addIsolatedUidLocked(isolatedUid, appUid); 3142f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3152f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3162f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3172f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void removeIsolatedUid(int isolatedUid, int appUid) { 3182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 31961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid); 3202f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3212f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3222f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void noteProcessStart(String name, int uid) { 3242f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 3252f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.noteProcessStartLocked(name, uid); 3262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3282f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3291e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessCrash(String name, int uid) { 3301e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 3311e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessCrashLocked(name, uid); 3321e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3331e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3341e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 3351e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessAnr(String name, int uid) { 3361e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 3371e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessAnrLocked(name, uid); 3381e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3391e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3401e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 341a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteProcessFinish(String name, int uid) { 3422f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 343a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteProcessFinishLocked(name, uid); 3442f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3452f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3462f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 347a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteUidProcessState(int uid, int state) { 3482f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 349a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteUidProcessStateLocked(uid, state); 3502f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3512f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3522f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3532f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // Public interface... 3542f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getStatistics() { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingPermission( 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 3588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i("foo", "SENDING BATTERY INFO:"); 3598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 361010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 3624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 3634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = out.marshall(); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn public ParcelFileDescriptor getStatisticsStream() { 3710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mContext.enforceCallingPermission( 3720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn android.Manifest.permission.BATTERY_STATS, null); 3730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //Slog.i("foo", "SENDING BATTERY INFO:"); 3740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 3750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel out = Parcel.obtain(); 376010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 3774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 3784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] data = out.marshall(); 3810068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn out.recycle(); 3820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 3830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return ParcelFileDescriptor.fromData(data, "battery-stats"); 3840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } catch (IOException e) { 3850068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Unable to create shared memory", e); 3860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return null; 3870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3880068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3890068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3904870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn public boolean isCharging() { 3914870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn synchronized (mStats) { 3924870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn return mStats.isCharging(); 3934870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3944870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3954870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn 396ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeBatteryTimeRemaining() { 397ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 398ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime()); 399ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 400ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 401ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 402ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 403ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeChargeTimeRemaining() { 404ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 405ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime()); 406ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 407ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 408ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 409ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 410099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn public void noteEvent(int code, String name, int uid) { 411099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn enforceCallingPermission(); 412099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn synchronized (mStats) { 413099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn mStats.noteEventLocked(code, name, uid); 414099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 415099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 416099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncStart(String name, int uid) { 418fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 419fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 420fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncStartLocked(name, uid); 421fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 422fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 423fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 424fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncFinish(String name, int uid) { 425fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 426fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 427fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncFinishLocked(name, uid); 428fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 429fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 430fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 431fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobStart(String name, int uid) { 432fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 433fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 434fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobStartLocked(name, uid); 435fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 436fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 437fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 438fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobFinish(String name, int uid) { 439fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 440fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 441fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobFinishLocked(name, uid); 442fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 443fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 444fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 4451e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmStart(String name, int uid) { 4461e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 4471e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 4481e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmStartLocked(name, uid); 4491e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4501e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4511e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 4521e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmFinish(String name, int uid) { 4531e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 4541e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 4551e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmFinishLocked(name, uid); 4561e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4571e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4581e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 459a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelock(int uid, int pid, String name, String historyName, int type, 4603d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn boolean unimportantForLogging) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 463e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging, 46440c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 468cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 471cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeLocked(uid, pid, name, historyName, type, 472cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 476a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelockFromSource(WorkSource ws, int pid, String name, 477a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn String historyName, int type, boolean unimportantForLogging) { 4787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 480a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName, 481a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn type, unimportantForLogging); 4827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 485cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name, 486cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn String historyName, int type, WorkSource newWs, int newPid, String newName, 487e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn String newHistoryName, int newType, boolean newUnimportantForLogging) { 488e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn enforceCallingPermission(); 489e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn synchronized (mStats) { 490cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type, 491e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging); 492e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 493e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 494e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 495cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName, 496cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn int type) { 4977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 499cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type); 5007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 503d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn public void noteLongPartialWakelockStart(String name, String historyName, int uid) { 504d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn enforceCallingPermission(); 505d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn synchronized (mStats) { 506d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn mStats.noteLongPartialWakelockStart(name, historyName, uid); 507d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 508d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 509d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn 510d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn public void noteLongPartialWakelockFinish(String name, String historyName, int uid) { 511d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn enforceCallingPermission(); 512d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn synchronized (mStats) { 513d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn mStats.noteLongPartialWakelockFinish(name, historyName, uid); 514d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 515d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 516d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int uid, int sensor) { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStartSensorLocked(uid, sensor); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int uid, int sensor) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStopSensorLocked(uid, sensor); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 531a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOn(int uid, long durationMillis) { 532a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 533a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 534a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOnLocked(uid, durationMillis); 535a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 536a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 537a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 538a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOff(int uid) { 539a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 540a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 541a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOffLocked(uid); 542a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 543a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 544a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStartGpsLocked(uid); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStopGpsLocked(uid); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteScreenState(int state) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 561cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "begin noteScreenState"); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 563e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteScreenStateLocked(state); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 565cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end noteScreenState"); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 568617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightness(int brightness) { 569617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 570617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteScreenBrightnessLocked(brightness); 572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 573617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 574617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 575e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteUserActivity(int uid, int event) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 578e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteUserActivityLocked(uid, event); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 581617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 582280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn public void noteWakeUp(String reason, int reasonUid) { 583280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn enforceCallingPermission(); 584280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn synchronized (mStats) { 585280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn mStats.noteWakeUpLocked(reason, reasonUid); 586280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 587280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 588280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn 589e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteInteractive(boolean interactive) { 590617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 591617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 592e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteInteractiveLocked(interactive); 593617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 595e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 5961e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn public void noteConnectivityChanged(int type, String extra) { 5971e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn enforceCallingPermission(); 5981e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 5991e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteConnectivityChangedLocked(type, extra); 6001e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 6011e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 6021e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 603fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) { 604e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn enforceCallingPermission(); 605e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn synchronized (mStats) { 606fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi mStats.noteMobileRadioPowerState(powerState, timestampNs, uid); 607e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 608e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 609e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOn() { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOnLocked(); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOff() { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOffLocked(); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 623105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 624e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrength(SignalStrength signalStrength) { 625627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 626627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 627e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mStats.notePhoneSignalStrengthLocked(signalStrength); 628627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 629627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 630627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 631627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionState(int dataType, boolean hasData) { 632627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 633627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 634627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mStats.notePhoneDataConnectionStateLocked(dataType, hasData); 635627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 636627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 63732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 638f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneState(int state) { 63932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani enforceCallingPermission(); 640e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int simState = TelephonyManager.getDefault().getSimState(); 64132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani synchronized (mStats) { 642e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mStats.notePhoneStateLocked(state, simState); 64332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 64432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 64532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 64658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOn() { 647105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 648105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 64958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOnLocked(); 650105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 651105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 652105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 65358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOff() { 654105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 655105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 65658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOffLocked(); 657105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 658105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 659d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 660244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartAudio(int uid) { 661244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 662244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 663244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOnLocked(uid); 664244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 665244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 666244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 667244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopAudio(int uid) { 668244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 669244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 670244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOffLocked(uid); 671244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 672244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 673244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 674244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartVideo(int uid) { 675244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 676244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 677244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOnLocked(uid); 678244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 679244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 680244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 681244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopVideo(int uid) { 682244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 683244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 684244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOffLocked(uid); 685244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 686244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 687244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 68810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetAudio() { 68910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 69010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 69110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetAudioLocked(); 69210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 69310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 69410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 69510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetVideo() { 69610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 69710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 69810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetVideoLocked(); 69910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 70010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 70110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 7026d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOn(int uid) { 703abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 704abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 7056d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOnLocked(uid); 706abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 707abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 708abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 7096d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOff(int uid) { 710abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 711abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 7126d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOffLocked(uid); 7136d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7146d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7156d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7166d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStartCamera(int uid) { 7176d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 718cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "begin noteStartCamera"); 7196d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOnLocked(uid); 7216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 722cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end noteStartCamera"); 7236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7246d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStopCamera(int uid) { 7266d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7276d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7286d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOffLocked(uid); 7296d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7306d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7316d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7326d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetCamera() { 7336d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7346d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7356d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetCameraLocked(); 7366d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7376d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7386d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7396d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetFlashlight() { 7406d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7416d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7426d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetFlashlightLocked(); 743abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 744abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 745abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 746e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski @Override 7475f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) { 748e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski enforceCallingPermission(); 749e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 750e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // There was a change in WiFi power state. 751e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Collect data now for the past activity. 7520c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn synchronized (mStats) { 753a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if (mStats.isOnBattery()) { 75406f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH || 75506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active" 75606f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski : "inactive"; 7579f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mHandler.scheduleSync("wifi-data: " + type, 7589f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI); 759a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 7605f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski mStats.noteWifiRadioPowerState(powerState, tsNanos, uid); 7610c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn } 762e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 763e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 76458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunning(WorkSource ws) { 765d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 766d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 76758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningLocked(ws); 768d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 769d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 770d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 77158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) { 772d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 773d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 77458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningChangedLocked(oldWs, newWs); 77558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 77658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 77758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 77858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStopped(WorkSource ws) { 77958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn enforceCallingPermission(); 78058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn synchronized (mStats) { 78158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiStoppedLocked(ws); 782d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 783d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 784d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 785ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn public void noteWifiState(int wifiState, String accessPoint) { 786ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn enforceCallingPermission(); 787ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn synchronized (mStats) { 788ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn mStats.noteWifiStateLocked(wifiState, accessPoint); 789ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 790ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 791ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn 7923251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) { 7933251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 7943251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 7953251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth); 7963251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7973251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7983251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 7993251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiRssiChanged(int newRssi) { 8003251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 8013251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 8023251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiRssiChangedLocked(newRssi); 8033251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 8043251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 8053251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 806105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquired(int uid) { 807105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockAcquiredLocked(uid); 810105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 811105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 813105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleased(int uid) { 814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 815105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockReleasedLocked(uid); 817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 818105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8196ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 8206ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStarted(int uid) { 821105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 822105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 8236ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedLocked(uid); 824105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 825105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8266ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 8276ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStopped(int uid) { 828105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 829105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 8306ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedLocked(uid); 831105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 832105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabled(int uid) { 8355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 8365347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 8375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastEnabledLocked(uid); 8385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabled(int uid) { 8425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 8435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 8445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastDisabledLocked(uid); 8455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSource(WorkSource ws) { 8497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockAcquiredFromSourceLocked(ws); 8527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSource(WorkSource ws) { 8567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockReleasedFromSourceLocked(ws); 8597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8626ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedFromSource(WorkSource ws) { 8637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8656ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedFromSourceLocked(ws); 8667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8696ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedFromSource(WorkSource ws) { 8707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8726ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedFromSourceLocked(ws); 8737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 876a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) { 877a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 878a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 879a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph); 880a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 881a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 882a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 883a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) { 884a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 885a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 886a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws); 887a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 888a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 889a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 8907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSource(WorkSource ws) { 8917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastEnabledFromSourceLocked(ws); 8947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 8987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSource(WorkSource ws) { 8997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 9007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 9017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastDisabledFromSourceLocked(ws); 9027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 9037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 9047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 9057a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 9064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void noteNetworkInterfaceType(String iface, int networkType) { 9071059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey enforceCallingPermission(); 9081059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (mStats) { 9094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.noteNetworkInterfaceTypeLocked(iface, networkType); 9101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 9111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 9121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 9137a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 9147a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey public void noteNetworkStatsEnabled() { 9157a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey enforceCallingPermission(); 9167a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey synchronized (mStats) { 9177a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey mStats.noteNetworkStatsEnabledLocked(); 9187a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 9197a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 9207a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey 9218ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn @Override 92208c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) { 9238ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9248ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 92508c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid); 9268ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9278ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9288ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9298ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageInstalled(String pkgName, int versionCode) { 9308ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9318ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 9328ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageInstalledLocked(pkgName, versionCode); 9338ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9348ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9358ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9368ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageUninstalled(String pkgName) { 9378ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9388ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 9398ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageUninstalledLocked(pkgName); 9408ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9418ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9428ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9436771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski @Override 9446771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski public void noteBleScanStarted(WorkSource ws) { 9456771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski enforceCallingPermission(); 9469f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 9479f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mStats.noteBluetoothScanStartedFromSourceLocked(ws); 9489f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9496771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9506771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 9516771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski @Override 9526771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski public void noteBleScanStopped(WorkSource ws) { 9536771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski enforceCallingPermission(); 9549f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 9559f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mStats.noteBluetoothScanStoppedFromSourceLocked(ws); 9569f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9579f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9589f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski 9599f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski @Override 9609f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski public void noteResetBleScan() { 9619f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski enforceCallingPermission(); 9629f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 9639f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mStats.noteResetBluetoothScanLocked(); 9649f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9656771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9666771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 967010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 968010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteWifiControllerActivity(WifiActivityEnergyInfo info) { 969010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 970010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 971010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 972010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid wifi data given: " + info); 973010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 974010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 975010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 976010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski synchronized (mStats) { 977010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateWifiStateLocked(info); 978010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 979010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 980010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 981010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 982010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) { 983010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 984010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 985010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid bluetooth data given: " + info); 986010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 987010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 988010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 989010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski synchronized (mStats) { 990010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateBluetoothStateLocked(info); 991010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 992010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 993010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 994010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 995010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteModemControllerActivity(ModemActivityInfo info) { 996010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 997010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 998010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 999010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid modem data given: " + info); 1000010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 1001010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1002010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1003010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski synchronized (mStats) { 1004010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), info); 1005010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1006010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1007010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.isOnBattery(); 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1012d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski @Override 1013d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski public void setBatteryState(final int status, final int health, final int plugType, 1014041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski final int level, final int temp, final int volt, final int chargeUAh, 1015041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski final int chargeFullUAh) { 1016d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski enforceCallingPermission(); 1017d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 1018d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // BatteryService calls us here and we may update external state. It would be wrong 1019d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // to block such a low level service like BatteryService on external stats like WiFi. 1020d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski mHandler.post(new Runnable() { 1021d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski @Override 1022d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski public void run() { 1023cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "begin setBatteryStateLocked"); 1024cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski try { 1025cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski synchronized (mStats) { 1026cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE; 1027cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski if (mStats.isOnBattery() == onBattery) { 1028cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski // The battery state has not changed, so we don't need to sync external 1029cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski // stats immediately. 1030cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, 1031cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski volt, 1032cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski chargeUAh, chargeFullUAh); 1033cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return; 1034cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } 1035d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1036cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } finally { 1037cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end setBatteryStateLocked"); 1038d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1039d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 1040d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // Sync external stats first as the battery has changed states. If we don't sync 1041d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // immediately here, we may not collect the relevant data later. 1042010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("battery-state", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 1043cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "begin setBatteryStateLocked"); 1044d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski synchronized (mStats) { 1045926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt, 1046041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski chargeUAh, chargeFullUAh); 1047d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1048cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end setBatteryStateLocked"); 1049d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1050d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski }); 1051633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 1052633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimeBattery(); 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimePlugged(); 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission() { 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS, 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingPid(), Binder.getCallingUid(), null); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1072c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1073c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final class WakeupReasonThread extends Thread { 1074515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static final int MAX_REASON_SIZE = 512; 1075515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharsetDecoder mDecoder; 1076515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private ByteBuffer mUtf8Buffer; 1077515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharBuffer mUtf16Buffer; 1078c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1079c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn WakeupReasonThread() { 1080c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn super("BatteryStats_wakeupReason"); 1081c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1082c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1083c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn public void run() { 1084c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND); 1085c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1086515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder = StandardCharsets.UTF_8 1087515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .newDecoder() 1088515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onMalformedInput(CodingErrorAction.REPLACE) 1089515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onUnmappableCharacter(CodingErrorAction.REPLACE) 1090515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .replaceWith("?"); 1091515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1092515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE); 1093515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE); 1094515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1095c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn try { 1096515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski String reason; 1097515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski while ((reason = waitWakeup()) != null) { 1098c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn synchronized (mStats) { 1099515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mStats.noteWakeupReasonLocked(reason); 1100c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1101c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1102c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } catch (RuntimeException e) { 1103c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Slog.e(TAG, "Failure reading wakeup reasons", e); 1104c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1105c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1106515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1107515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private String waitWakeup() { 1108515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.clear(); 1109515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.clear(); 1110515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.reset(); 1111515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1112515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski int bytesWritten = nativeWaitWakeup(mUtf8Buffer); 1113515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (bytesWritten < 0) { 1114515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return null; 1115515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } else if (bytesWritten == 0) { 1116515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return "unknown"; 1117515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1118515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1119515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Set the buffer's limit to the number of bytes written. 1120515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.limit(bytesWritten); 1121515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1122515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Decode the buffer from UTF-8 to UTF-16. 1123515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Unmappable characters will be replaced. 1124515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true); 1125515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.flip(); 1126515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1127515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Create a String from the UTF-16 buffer. 1128515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return mUtf16Buffer.toString(); 1129515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1130c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1131c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1132515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static native int nativeWaitWakeup(ByteBuffer outBuffer); 1133c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1134ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn private void dumpHelp(PrintWriter pw) { 113591268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn pw.println("Battery stats (batterystats) dump options:"); 11361e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn pw.println(" [--checkin] [--history] [--history-start] [--charged] [-c]"); 1137d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]"); 1138865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" --checkin: generate output for a checkin report; will write (and clear) the"); 1139865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" last old completed stats when they had been reset."); 11401476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato pw.println(" -c: write the current stats in checkin format."); 1141099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn pw.println(" --history: show only history data."); 1142c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --history-start <num>: show only history data starting at given time offset."); 1143c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --charged: only output data since last charged."); 1144d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --daily: only output full daily data."); 1145ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --reset: reset the stats, clearing all current data."); 1146ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --write: force write current collected stats to disk."); 1147d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --new-daily: immediately create and write new daily stats record."); 1148d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --read-daily: read-load last written daily stats."); 1149cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println(" <package.name>: optional name of package to filter output by."); 1150fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" -h: print this help text."); 1151fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println("Battery stats (batterystats) commands:"); 1152fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" enable|disable <option>"); 1153fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Enable or disable a running option. Option state is not saved across boots."); 1154fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Options are:"); 11550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn pw.println(" full-history: include additional detailed events in battery history:"); 11561e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn pw.println(" wake_lock_in, alarms and proc events"); 1157fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" no-auto-reset: don't automatically reset stats when unplugged"); 1158674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani pw.println(" pretend-screen-off: pretend the screen is off, even if screen state changes"); 1159ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 1160ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 1161cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) { 1162cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i++; 1163cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i >= args.length) { 1164cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Missing option argument for " + (enable ? "--enable" : "--disable")); 1165cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1166cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1167cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 11680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) { 1169cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 11700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.setRecordAllHistoryLocked(enable); 1171cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 11729a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } else if ("no-auto-reset".equals(args[i])) { 11739a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn synchronized (mStats) { 11749a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn mStats.setNoAutoReset(enable); 11759a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } 1176674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani } else if ("pretend-screen-off".equals(args[i])) { 1177674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani synchronized (mStats) { 1178674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani mStats.setPretendScreenOff(enable); 1179674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani } 1180cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else { 1181cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Unknown enable/disable option: " + args[i]); 1182cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1183cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1184cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1185cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return i; 1186cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1187cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 11884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 11913abd75ba3a981850cac43a401d0014a836559cb0Kenny Root if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 11923abd75ba3a981850cac43a401d0014a836559cb0Kenny Root != PackageManager.PERMISSION_GRANTED) { 11933abd75ba3a981850cac43a401d0014a836559cb0Kenny Root pw.println("Permission Denial: can't dump BatteryStats from from pid=" 11943abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() 11953abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + " without permission " + android.Manifest.permission.DUMP); 11963abd75ba3a981850cac43a401d0014a836559cb0Kenny Root return; 11973abd75ba3a981850cac43a401d0014a836559cb0Kenny Root } 11983abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 1199c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn int flags = 0; 12000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean useCheckinFormat = false; 12010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean isRealCheckin = false; 12020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean noOutput = false; 120316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn boolean writeData = false; 1204c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn long historyStart = -1; 1205cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn int reqUid = -1; 1206e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (args != null) { 1207c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn for (int i=0; i<args.length; i++) { 1208c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn String arg = args[i]; 1209e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ("--checkin".equals(arg)) { 12100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 12110068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn isRealCheckin = true; 1212099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } else if ("--history".equals(arg)) { 1213c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1214c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--history-start".equals(arg)) { 1215c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1216c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn i++; 1217c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (i >= args.length) { 1218c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println("Missing time argument for --history-since"); 1219c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn dumpHelp(pw); 1220c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn return; 1221c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1222c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn historyStart = Long.parseLong(args[i]); 122316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn writeData = true; 122449021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn } else if ("-c".equals(arg)) { 12250068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 1226c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_INCLUDE_HISTORY; 1227c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--charged".equals(arg)) { 1228c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1229d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--daily".equals(arg)) { 1230d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn flags |= BatteryStats.DUMP_DAILY_ONLY; 1231e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("--reset".equals(arg)) { 1232e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 12333d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn mStats.resetAllStatsCmdLocked(); 1234e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pw.println("Battery stats reset."); 12350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1237010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 12380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ("--write".equals(arg)) { 1239010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 12400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn synchronized (mStats) { 12410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mStats.writeSyncLocked(); 12420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Battery stats written."); 12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 1245d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--new-daily".equals(arg)) { 1246d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1247d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.recordDailyStatsLocked(); 1248d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("New daily stats written."); 1249d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1250d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1251d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--read-daily".equals(arg)) { 1252d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1253d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.readDailyStatsLocked(); 1254d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("Last daily stats read."); 1255d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1256d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1257fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--enable".equals(arg) || "enable".equals(arg)) { 1258cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, true); 1259cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1260cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1261cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1262cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Enabled: " + args[i]); 1263cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1264fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--disable".equals(arg) || "disable".equals(arg)) { 1265cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, false); 1266cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1267cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1268cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1269cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Disabled: " + args[i]); 1270cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1271ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } else if ("-h".equals(arg)) { 1272ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1273ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn return; 1274e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood } else if ("-a".equals(arg)) { 1275a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn flags |= BatteryStats.DUMP_VERBOSE; 1276cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else if (arg.length() > 0 && arg.charAt(0) == '-'){ 12770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Unknown option: " + arg); 1278ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1279cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1280cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else { 1281cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn // Not an option, last argument must be a package name. 1282cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn try { 1283e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey reqUid = mContext.getPackageManager().getPackageUidAsUser(arg, 1284cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn UserHandle.getCallingUserId()); 1285cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 1286cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println("Unknown package: " + arg); 1287cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn dumpHelp(pw); 1288cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1289cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1292e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 12930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (noOutput) { 12940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 129613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 129713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn long ident = Binder.clearCallingIdentity(); 129813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn try { 129913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn if (BatteryStatsHelper.checkWifiOnly(mContext)) { 130013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY; 130113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } 130213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn // Fetch data from external sources and update the BatteryStatsImpl object with them. 1303010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 130413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } finally { 130513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn Binder.restoreCallingIdentity(ident); 1306d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn } 130713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 1308ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn if (reqUid >= 0) { 1309ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // By default, if the caller is only interested in a specific package, then 1310ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // we only dump the aggregated data since charged. 13111e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) { 1312ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1313ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // Also if they are doing -c, we don't want history. 1314ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY; 1315ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 1316ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 13174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 13180068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (useCheckinFormat) { 13199cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications( 13200d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL); 13210068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (isRealCheckin) { 13220068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // For a real checkin, first we want to prefer to use the last complete checkin 13230068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // file if there is one. 13240068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn synchronized (mStats.mCheckinFile) { 13250068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (mStats.mCheckinFile.exists()) { 13260068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 13270068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] raw = mStats.mCheckinFile.readFully(); 13280068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (raw != null) { 13290068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel in = Parcel.obtain(); 13300068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.unmarshall(raw, 0, raw.length); 13310068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.setDataPosition(0); 13320068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsImpl checkinStats = new BatteryStatsImpl( 13334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski null, mStats.mHandler, null); 13340068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.readSummaryFromParcel(in); 13350068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.recycle(); 13360068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.dumpCheckinLocked(mContext, pw, apps, flags, 13370068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn historyStart); 13380068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.mCheckinFile.delete(); 13390068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return; 13400068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13419ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski } catch (IOException | ParcelFormatException e) { 13420068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Failure reading checkin file " 13430068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn + mStats.mCheckinFile.getBaseFile(), e); 13440068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13450068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 1348cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid()); 1349e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1350c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart); 135116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 135216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 135316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1354e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1355cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end dumpCheckinLocked"); 1356e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 1357cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid()); 1358e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1359c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart); 136016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 136116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 136216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1363e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1364cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end dumpLocked"); 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1368010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private WifiActivityEnergyInfo extractDelta(WifiActivityEnergyInfo latest) { 1369010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long timePeriodMs = latest.mTimestamp - mLastInfo.mTimestamp; 1370010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long lastIdleMs = mLastInfo.mControllerIdleTimeMs; 1371010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long lastTxMs = mLastInfo.mControllerTxTimeMs; 1372010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long lastRxMs = mLastInfo.mControllerRxTimeMs; 1373010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final long lastEnergy = mLastInfo.mControllerEnergyUsed; 1374010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1375010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // We will modify the last info object to be the delta, and store the new 1376010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // WifiActivityEnergyInfo object as our last one. 1377010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final WifiActivityEnergyInfo delta = mLastInfo; 1378010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mTimestamp = latest.getTimeStamp(); 1379010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mStackState = latest.getStackState(); 1380010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1381684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs; 1382684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs; 1383684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs; 1384684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius 1385684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius if (txTimeMs < 0 || rxTimeMs < 0) { 1386010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // The stats were reset by the WiFi system (which is why our delta is negative). 1387010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Returns the unaltered stats. 1388010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mControllerEnergyUsed = latest.mControllerEnergyUsed; 1389010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mControllerRxTimeMs = latest.mControllerRxTimeMs; 1390010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mControllerTxTimeMs = latest.mControllerTxTimeMs; 1391010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs; 1392010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta); 1393684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius } else { 1394684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius final long totalActiveTimeMs = txTimeMs + rxTimeMs; 1395684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius long maxExpectedIdleTimeMs; 1396684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius if (totalActiveTimeMs > timePeriodMs) { 13972078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius // Cap the max idle time at zero since the active time consumed the whole time 13982078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius maxExpectedIdleTimeMs = 0; 13992078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius if (totalActiveTimeMs > timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) { 14002078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius StringBuilder sb = new StringBuilder(); 14012078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append("Total Active time "); 14022078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(totalActiveTimeMs, sb); 14032078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" is longer than sample period "); 14042078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(timePeriodMs, sb); 14052078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(".\n"); 14062078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append("Previous WiFi snapshot: ").append("idle="); 14072078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(lastIdleMs, sb); 14082078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" rx="); 14092078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(lastRxMs, sb); 14102078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" tx="); 14112078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(lastTxMs, sb); 14122078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" e=").append(lastEnergy); 14132078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append("\n"); 14142078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append("Current WiFi snapshot: ").append("idle="); 14152078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb); 14162078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" rx="); 14172078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb); 14182078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" tx="); 14192078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb); 14202078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius sb.append(" e=").append(latest.mControllerEnergyUsed); 14212078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius Slog.wtf(TAG, sb.toString()); 14222078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius } 1423684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius } else { 1424684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs; 1425684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius } 1426684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // These times seem to be the most reliable. 1427684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius delta.mControllerTxTimeMs = txTimeMs; 1428684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius delta.mControllerRxTimeMs = rxTimeMs; 1429684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // WiFi calculates the idle time as a difference from the on time and the various 1430684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // Rx + Tx times. There seems to be some missing time there because this sometimes 1431684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // becomes negative. Just cap it at 0 and ensure that it is less than the expected idle 1432684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // time from the difference in timestamps. 1433684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius // b/21613534 1434684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius delta.mControllerIdleTimeMs = Math.min(maxExpectedIdleTimeMs, Math.max(0, idleTimeMs)); 1435684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy); 1436010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1437010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1438010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mLastInfo = latest; 1439010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return delta; 14404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 14414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1442010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski /** 1443010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * Helper method to extract the Parcelable controller info from a 1444010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * SynchronousResultReceiver. 1445010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski */ 1446010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private static <T extends Parcelable> T awaitControllerInfo( 1447010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Nullable SynchronousResultReceiver receiver) throws TimeoutException { 1448010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (receiver == null) { 1449010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return null; 14504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 14514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1452010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final SynchronousResultReceiver.Result result = 1453010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski receiver.awaitResult(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS); 1454010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (result.bundle != null) { 1455010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // This is the final destination for the Bundle. 1456010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski result.bundle.setDefusable(true); 1457010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1458010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final T data = result.bundle.getParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY); 1459010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (data != null) { 1460010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return data; 146121f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 146221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 1463010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "no controller energy info supplied"); 146421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski return null; 146521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 146621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski 14674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 14684b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates 14694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * batterystats with that information. 14704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * 14714b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * We first grab a lock specific to this method, then once all the data has been collected, 14724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * we grab the mStats lock and update the data. 1473c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski * 1474c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski * @param reason The reason why this collection was requested. Useful for debugging. 1475a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski * @param updateFlags Which external stats to update. Can be a combination of 14769f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski * {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_CPU}, 14779f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski * {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_RADIO}, 14789f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski * {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_WIFI}, 14799f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski * and {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_BT}. 14804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 1481010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski void updateExternalStatsSync(final String reason, int updateFlags) { 1482010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SynchronousResultReceiver wifiReceiver = null; 1483010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SynchronousResultReceiver bluetoothReceiver = null; 1484010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SynchronousResultReceiver modemReceiver = null; 1485010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1486cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason); 14874b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mExternalStatsLock) { 1488e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski if (mContext == null) { 1489010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Don't do any work yet. 1490cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end updateExternalStatsSync"); 1491e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski return; 1492e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 1493e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 14949f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) { 1495010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (mWifiManager == null) { 1496010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mWifiManager = IWifiManager.Stub.asInterface( 1497010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski ServiceManager.getService(Context.WIFI_SERVICE)); 1498010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1499a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1500010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (mWifiManager != null) { 1501010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski try { 1502010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski wifiReceiver = new SynchronousResultReceiver(); 1503010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mWifiManager.requestActivityInfo(wifiReceiver); 1504010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } catch (RemoteException e) { 1505010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski // Oh well. 1506010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1507010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 150821f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 150921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski 15109f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) { 1511010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 1512010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (adapter != null) { 1513010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski bluetoothReceiver = new SynchronousResultReceiver(); 1514991357fe25b3addabf85b871df3f4098fc4b833bAdam Lesinski adapter.requestControllerActivityEnergyInfo(bluetoothReceiver); 1515010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1516c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski } 1517c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski 1518010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) { 1519010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (mTelephony == null) { 1520010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mTelephony = TelephonyManager.from(mContext); 15210c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn } 152272478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski 1523010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (mTelephony != null) { 1524010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski modemReceiver = new SynchronousResultReceiver(); 1525010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mTelephony.requestModemActivityInfo(modemReceiver); 1526a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1527010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1528a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1529010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski WifiActivityEnergyInfo wifiInfo = null; 1530010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski BluetoothActivityEnergyInfo bluetoothInfo = null; 1531010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski ModemActivityInfo modemInfo = null; 1532010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski try { 1533010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski wifiInfo = awaitControllerInfo(wifiReceiver); 1534010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } catch (TimeoutException e) { 1535010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.w(TAG, "Timeout reading wifi stats"); 1536010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1537010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1538010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski try { 1539010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski bluetoothInfo = awaitControllerInfo(bluetoothReceiver); 1540010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } catch (TimeoutException e) { 1541010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.w(TAG, "Timeout reading bt stats"); 1542010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1543010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1544010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski try { 1545010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski modemInfo = awaitControllerInfo(modemReceiver); 1546010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } catch (TimeoutException e) { 1547010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.w(TAG, "Timeout reading modem stats"); 1548010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1549010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1550010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski synchronized (mStats) { 1551010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.addHistoryEventLocked( 1552010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SystemClock.elapsedRealtime(), 1553010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski SystemClock.uptimeMillis(), 1554010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, 1555010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski reason, 0); 1556010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1557010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateCpuTimeLocked(); 1558010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateKernelWakelocksLocked(); 15592dd7e5e3ef0a20864a5908fd8c0896776575d68aJames Carr mStats.updateKernelMemoryBandwidthLocked(); 1560010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1561010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (wifiInfo != null) { 1562010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (wifiInfo.isValid()) { 1563010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateWifiStateLocked(extractDelta(wifiInfo)); 1564010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } else { 1565010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "wifi info is invalid: " + wifiInfo); 1566010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1567a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1568a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1569010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (bluetoothInfo != null) { 1570010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (bluetoothInfo.isValid()) { 1571010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateBluetoothStateLocked(bluetoothInfo); 1572010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } else { 1573010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo); 1574010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1575a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1576a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1577010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (modemInfo != null) { 1578010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (modemInfo.isValid()) { 1579010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), 1580010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski modemInfo); 1581010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } else { 1582010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "modem info is invalid: " + modemInfo); 1583010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 158472478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski } 15854b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 15864b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1587cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski Slog.d(TAG, "end updateExternalStatsSync"); 15884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1589713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1590713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1591713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a snapshot of the system health for a particular uid. 1592713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1593713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato @Override 1594713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato public HealthStatsParceler takeUidSnapshot(int requestUid) { 1595713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (requestUid != Binder.getCallingUid()) { 1596713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato mContext.enforceCallingOrSelfPermission( 1597713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato android.Manifest.permission.BATTERY_STATS, null); 1598713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1599713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato long ident = Binder.clearCallingIdentity(); 1600713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato try { 1601010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("get-health-stats-for-uid", 1602713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 1603713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato synchronized (mStats) { 1604713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return getHealthStatsForUidLocked(requestUid); 1605713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1606713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } catch (Exception ex) { 1607713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Slog.d(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex); 1608713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato throw ex; 1609713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } finally { 1610713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Binder.restoreCallingIdentity(ident); 1611713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1612713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1613713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1614713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1615713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a snapshot of the system health for a number of uids. 1616713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1617713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato @Override 1618713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) { 1619713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (!onlyCaller(requestUids)) { 1620713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato mContext.enforceCallingOrSelfPermission( 1621713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato android.Manifest.permission.BATTERY_STATS, null); 1622713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1623713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato long ident = Binder.clearCallingIdentity(); 1624713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato int i=-1; 1625713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato try { 1626010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski updateExternalStatsSync("get-health-stats-for-uids", 1627713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL); 1628713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato synchronized (mStats) { 1629713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int N = requestUids.length; 1630713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsParceler[] results = new HealthStatsParceler[N]; 1631713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato for (i=0; i<N; i++) { 1632713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato results[i] = getHealthStatsForUidLocked(requestUids[i]); 1633713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1634713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return results; 1635713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1636713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } catch (Exception ex) { 1637713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Slog.d(TAG, "Crashed while writing for takeUidSnapshots(" 1638713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato + Arrays.toString(requestUids) + ") i=" + i, ex); 1639713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato throw ex; 1640713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } finally { 1641713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Binder.restoreCallingIdentity(ident); 1642713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1643713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1644713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1645713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1646713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Returns whether the Binder.getCallingUid is the only thing in requestUids. 1647713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1648713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato private static boolean onlyCaller(int[] requestUids) { 1649713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int caller = Binder.getCallingUid(); 1650713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int N = requestUids.length; 1651713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato for (int i=0; i<N; i++) { 1652713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (requestUids[i] != caller) { 1653713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return false; 1654713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1655713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1656713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return true; 1657713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1658713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1659713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1660713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a HealthStatsParceler for the given uid. You should probably call 1661010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * updateExternalStatsSync first. 1662713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1663713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato HealthStatsParceler getHealthStatsForUidLocked(int requestUid) { 1664713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter(); 1665713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS); 1666713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid); 1667713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (uid != null) { 1668713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato writer.writeUid(uidWriter, mStats, uid); 1669713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1670713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return new HealthStatsParceler(uidWriter); 1671713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1672713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1674