BatteryStatsService.java revision 21f76aa77075be5e057c36040d7d6e695c669b72
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 194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo; 203f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothAdapter; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 22e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo; 233abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager; 244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.IWifiManager; 254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo; 2691268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 286f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Looper; 314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Message; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 330068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor; 349ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException; 35cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 39e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock; 40cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle; 417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 4206f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo; 4321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo; 44e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 45e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager; 4661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskiimport android.util.IntArray; 478a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 49bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinskiimport android.util.TimeUtils; 504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy; 5132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats; 52d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper; 5332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl; 54e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile; 5521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport com.android.internal.telephony.ITelephony; 564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.server.FgThread; 57cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices; 5832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File; 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 63515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer; 64515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer; 65515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder; 66515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction; 67515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets; 68e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 74cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub 75cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn implements PowerManagerInternal.LowPowerModeListener { 76c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn static final String TAG = "BatteryStatsService"; 77c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static IBatteryStats sService; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl mStats; 804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski final BatteryStatsHandler mHandler; 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context mContext; 82cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn PowerManagerInternal mPowerManagerInternal; 833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 84a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final int UPDATE_CPU = 0x01; 85a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final int UPDATE_WIFI = 0x02; 86a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final int UPDATE_RADIO = 0x04; 87a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final int UPDATE_BT = 0x08; 88a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT; 89a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync { 914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public static final int MSG_SYNC_EXTERNAL_STATS = 1; 924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public static final int MSG_WRITE_TO_DISK = 2; 93a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski private int mUpdateFlags = 0; 9461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski private IntArray mUidsToRemove = new IntArray(); 954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public BatteryStatsHandler(Looper looper) { 974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski super(looper); 984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 1014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void handleMessage(Message msg) { 1024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski switch (msg.what) { 1034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski case MSG_SYNC_EXTERNAL_STATS: 104a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final int updateFlags; 105a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski synchronized (this) { 106a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski removeMessages(MSG_SYNC_EXTERNAL_STATS); 107a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateFlags = mUpdateFlags; 108a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mUpdateFlags = 0; 109a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 110a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateExternalStats((String)msg.obj, updateFlags); 11156d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski 11256d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski // other parts of the system could be calling into us 11356d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski // from mStats in order to report of changes. We must grab the mStats 11456d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski // lock before grabbing our own or we'll end up in a deadlock. 11556d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski synchronized (mStats) { 11656d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski synchronized (this) { 11761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski final int numUidsToRemove = mUidsToRemove.size(); 11861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski for (int i = 0; i < numUidsToRemove; i++) { 11961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mStats.removeIsolatedUidLocked(mUidsToRemove.get(i)); 12061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 12161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 12261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUidsToRemove.clear(); 12361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 1244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski break; 1254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski case MSG_WRITE_TO_DISK: 127a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateExternalStats("write", UPDATE_ALL); 1284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 1294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeAsyncLocked(); 1304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski break; 1324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1344b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 1360c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn public void scheduleSync(String reason) { 13761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski synchronized (this) { 13861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski scheduleSyncLocked(reason, UPDATE_ALL); 13961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 140a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 141a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 142a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski @Override 143a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski public void scheduleWifiSync(String reason) { 14461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski synchronized (this) { 14561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski scheduleSyncLocked(reason, UPDATE_WIFI); 14661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 147a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 148a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 14961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski @Override 15061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski public void scheduleCpuSyncDueToRemovedUid(int uid) { 151a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski synchronized (this) { 15261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski scheduleSyncLocked("remove-uid", UPDATE_CPU); 15361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUidsToRemove.add(uid); 15461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 15561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski } 15661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski 15761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski private void scheduleSyncLocked(String reason, int updateFlags) { 15861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski if (mUpdateFlags == 0) { 15961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason)); 1604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 16161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mUpdateFlags |= updateFlags; 1624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsService(File systemDir, Handler handler) { 1664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Our handler here will be accessing the disk, use a different thread than 1674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // what the ActivityManagerService gave us (no I/O on that one!). 1684b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mHandler = new BatteryStatsHandler(FgThread.getHandler().getLooper()); 1694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through. 1714b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats = new BatteryStatsImpl(systemDir, handler, mHandler); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void publish(Context context) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 176f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mStats.setRadioScanningTimeout(mContext.getResources().getInteger( 177f37447bad3773b62176baa837908daf6edb44273Amith Yamasani com.android.internal.R.integer.config_radioScanningTimeout) 178f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * 1000L); 179e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski mStats.setPowerProfile(new PowerProfile(context)); 1806832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder()); 1812c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 1822c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 1832c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown /** 1842c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * At the time when the constructor runs, the power manager has not yet been 1852c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * initialized. So we initialize the low power observer later. 1862c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown */ 1872c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown public void initPowerManagement() { 188cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); 189cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mPowerManagerInternal.registerLowPowerModeObserver(this); 1908ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePowerSaveMode(mPowerManagerInternal.getLowPowerModeEnabled()); 191c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn (new WakeupReasonThread()).start(); 1922c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 1932c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 19455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn public void shutdown() { 1958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w("BatteryStats", "Writing battery stats before shutdown..."); 1964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 197a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateExternalStats("shutdown", UPDATE_ALL); 19855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn synchronized (mStats) { 1996b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.shutdownLocked(); 20055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 20155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 20255280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static IBatteryStats getService() { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20791268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = asInterface(b); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 211cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 212cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn @Override 213cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void onLowPowerModeChanged(boolean enabled) { 214cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 2158ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePowerSaveMode(enabled); 216cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 217cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 218cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current statistics object, which may be modified 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to reflect events that affect battery usage. You must lock the 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stats object before doing anything with it. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getActiveStatistics() { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2270068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 2284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 2294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Schedules a write to disk to occur. This will cause the BatteryStatsImpl 2304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * object to update with the latest info, then write to disk. 2314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 2324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void scheduleWriteToDisk() { 2334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK); 2344b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 2354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 2362f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // These are for direct use by the activity manager... 2372f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 238b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski /** 239b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski * Remove a UID from the BatteryStats and BatteryStats' external dependencies. 240b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski */ 241b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski void removeUid(int uid) { 242b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski synchronized (mStats) { 243b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski mStats.removeUidStatsLocked(uid); 244b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 245b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 246b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski 2472f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void addIsolatedUid(int isolatedUid, int appUid) { 2482f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 2492f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.addIsolatedUidLocked(isolatedUid, appUid); 2502f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2512f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2522f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2532f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void removeIsolatedUid(int isolatedUid, int appUid) { 2542f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 25561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid); 2562f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2572f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2582f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2592f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void noteProcessStart(String name, int uid) { 2602f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 2612f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.noteProcessStartLocked(name, uid); 2622f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2632f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2642f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2651e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessCrash(String name, int uid) { 2661e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 2671e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessCrashLocked(name, uid); 2681e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 2691e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 2701e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 2711e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessAnr(String name, int uid) { 2721e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 2731e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessAnrLocked(name, uid); 2741e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 2751e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 2761e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 277a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteProcessFinish(String name, int uid) { 2782f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 279a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteProcessFinishLocked(name, uid); 2802f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2812f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2822f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 283a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteUidProcessState(int uid, int state) { 2842f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 285a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteUidProcessStateLocked(uid, state); 2862f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2872f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2882f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2892f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // Public interface... 2902f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getStatistics() { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingPermission( 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 2948a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i("foo", "SENDING BATTERY INFO:"); 2958a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 297a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateExternalStats("get-stats", UPDATE_ALL); 2984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 2994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = out.marshall(); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3050068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3060068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn public ParcelFileDescriptor getStatisticsStream() { 3070068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mContext.enforceCallingPermission( 3080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn android.Manifest.permission.BATTERY_STATS, null); 3090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //Slog.i("foo", "SENDING BATTERY INFO:"); 3100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 3110068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel out = Parcel.obtain(); 312a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateExternalStats("get-stats", UPDATE_ALL); 3134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 3144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] data = out.marshall(); 3170068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn out.recycle(); 3180068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 3190068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return ParcelFileDescriptor.fromData(data, "battery-stats"); 3200068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } catch (IOException e) { 3210068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Unable to create shared memory", e); 3220068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return null; 3230068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3240068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3250068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3264870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn public boolean isCharging() { 3274870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn synchronized (mStats) { 3284870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn return mStats.isCharging(); 3294870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3304870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3314870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn 332ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeBatteryTimeRemaining() { 333ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 334ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime()); 335ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 336ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 337ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 338ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 339ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeChargeTimeRemaining() { 340ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 341ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime()); 342ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 343ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 344ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 345ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 346099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn public void noteEvent(int code, String name, int uid) { 347099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn enforceCallingPermission(); 348099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn synchronized (mStats) { 349099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn mStats.noteEventLocked(code, name, uid); 350099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 351099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 352099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 353fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncStart(String name, int uid) { 354fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 355fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 356fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncStartLocked(name, uid); 357fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 358fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 359fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 360fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncFinish(String name, int uid) { 361fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 362fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 363fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncFinishLocked(name, uid); 364fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 365fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 366fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 367fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobStart(String name, int uid) { 368fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 369fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 370fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobStartLocked(name, uid); 371fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 372fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 373fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 374fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobFinish(String name, int uid) { 375fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 376fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 377fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobFinishLocked(name, uid); 378fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 379fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 380fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 3811e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmStart(String name, int uid) { 3821e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 3831e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 3841e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmStartLocked(name, uid); 3851e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 3861e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 3871e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 3881e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmFinish(String name, int uid) { 3891e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 3901e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 3911e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmFinishLocked(name, uid); 3921e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 3931e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 3941e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 395a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelock(int uid, int pid, String name, String historyName, int type, 3963d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn boolean unimportantForLogging) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 399e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging, 40040c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 404cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 407cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeLocked(uid, pid, name, historyName, type, 408cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 412a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelockFromSource(WorkSource ws, int pid, String name, 413a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn String historyName, int type, boolean unimportantForLogging) { 4147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 416a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName, 417a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn type, unimportantForLogging); 4187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 421cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name, 422cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn String historyName, int type, WorkSource newWs, int newPid, String newName, 423e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn String newHistoryName, int newType, boolean newUnimportantForLogging) { 424e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn enforceCallingPermission(); 425e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn synchronized (mStats) { 426cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type, 427e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging); 428e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 429e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 430e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 431cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName, 432cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn int type) { 4337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 435cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type); 4367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int uid, int sensor) { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 4429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStartSensorLocked(uid, sensor); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int uid, int sensor) { 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 4499adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStopSensorLocked(uid, sensor); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 453a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOn(int uid, long durationMillis) { 454a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 455a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 456a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOnLocked(uid, durationMillis); 457a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 458a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 459a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 460a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOff(int uid) { 461a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 462a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 463a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOffLocked(uid); 464a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 465a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 466a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 4706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStartGpsLocked(uid); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 4776b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStopGpsLocked(uid); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 481e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteScreenState(int state) { 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 484e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteScreenStateLocked(state); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 488617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightness(int brightness) { 489617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 490617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 491617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteScreenBrightnessLocked(brightness); 492617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 493617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 494617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 495e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteUserActivity(int uid, int event) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 498e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteUserActivityLocked(uid, event); 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 501617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 502280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn public void noteWakeUp(String reason, int reasonUid) { 503280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn enforceCallingPermission(); 504280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn synchronized (mStats) { 505280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn mStats.noteWakeUpLocked(reason, reasonUid); 506280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 507280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 508280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn 509e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteInteractive(boolean interactive) { 510617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 511617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 512e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteInteractiveLocked(interactive); 513617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 514617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 515e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 5161e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn public void noteConnectivityChanged(int type, String extra) { 5171e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn enforceCallingPermission(); 5181e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 5191e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteConnectivityChangedLocked(type, extra); 5201e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 5211e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 5221e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 5232ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn public void noteMobileRadioPowerState(int powerState, long timestampNs) { 524e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn enforceCallingPermission(); 525e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn synchronized (mStats) { 5262ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn mStats.noteMobileRadioPowerState(powerState, timestampNs); 527e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 528e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 529e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOn() { 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOnLocked(); 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOff() { 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOffLocked(); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 543105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 544e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrength(SignalStrength signalStrength) { 545627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 546627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 547e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mStats.notePhoneSignalStrengthLocked(signalStrength); 548627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 549627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 550627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 551627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionState(int dataType, boolean hasData) { 552627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 553627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 554627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mStats.notePhoneDataConnectionStateLocked(dataType, hasData); 555627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 556627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 55732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 558f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneState(int state) { 55932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani enforceCallingPermission(); 560e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int simState = TelephonyManager.getDefault().getSimState(); 56132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani synchronized (mStats) { 562e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mStats.notePhoneStateLocked(state, simState); 56332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 56432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 56532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 56658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOn() { 567105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 568105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 56958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOnLocked(); 570105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 571105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 572105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 57358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOff() { 574105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 575105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 57658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOffLocked(); 577105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 578105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 579d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 580244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartAudio(int uid) { 581244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 583244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOnLocked(uid); 584244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 585244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 586244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 587244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopAudio(int uid) { 588244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 589244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 590244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOffLocked(uid); 591244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 592244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 593244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 594244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartVideo(int uid) { 595244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 596244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 597244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOnLocked(uid); 598244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 599244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 600244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 601244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopVideo(int uid) { 602244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 603244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 604244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOffLocked(uid); 605244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 606244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 607244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 60810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetAudio() { 60910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 61010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 61110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetAudioLocked(); 61210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 61310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 61410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 61510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetVideo() { 61610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 61710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 61810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetVideoLocked(); 61910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 62010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 62110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 6226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOn(int uid) { 623abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 624abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 6256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOnLocked(uid); 626abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 627abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 628abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 6296d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOff(int uid) { 630abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 631abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 6326d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOffLocked(uid); 6336d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6346d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6356d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 6366d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStartCamera(int uid) { 6376d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 6386d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 6396d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOnLocked(uid); 6406d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6416d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6426d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 6436d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStopCamera(int uid) { 6446d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 6456d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 6466d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOffLocked(uid); 6476d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6486d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6496d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 6506d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetCamera() { 6516d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 6526d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 6536d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetCameraLocked(); 6546d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6556d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6566d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 6576d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetFlashlight() { 6586d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 6596d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 6606d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetFlashlightLocked(); 661abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 662abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 663abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 664e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski @Override 665e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public void noteWifiRadioPowerState(int powerState, long tsNanos) { 666e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski enforceCallingPermission(); 667e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 668e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // There was a change in WiFi power state. 669e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Collect data now for the past activity. 6700c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn synchronized (mStats) { 671a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if (mStats.isOnBattery()) { 67206f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH || 67306f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active" 67406f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski : "inactive"; 67506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski mHandler.scheduleWifiSync("wifi-data: " + type); 676a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 6770c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn mStats.noteWifiRadioPowerState(powerState, tsNanos); 6780c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn } 679e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 680e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 68158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunning(WorkSource ws) { 682d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 683d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 68458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningLocked(ws); 685d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 686d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 687d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 68858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) { 689d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 690d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 69158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningChangedLocked(oldWs, newWs); 69258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 69358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 69458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 69558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStopped(WorkSource ws) { 69658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn enforceCallingPermission(); 69758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn synchronized (mStats) { 69858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiStoppedLocked(ws); 699d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 700d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 701d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 702ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn public void noteWifiState(int wifiState, String accessPoint) { 703ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn enforceCallingPermission(); 704ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn synchronized (mStats) { 705ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn mStats.noteWifiStateLocked(wifiState, accessPoint); 706ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 707ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 708ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn 7093251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) { 7103251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 7113251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 7123251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth); 7133251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7143251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7153251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 7163251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiRssiChanged(int newRssi) { 7173251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 7183251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 7193251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiRssiChangedLocked(newRssi); 7203251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7213251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7223251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 723105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquired(int uid) { 724105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 725105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 726105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockAcquiredLocked(uid); 727105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 728105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 729105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 730105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleased(int uid) { 731105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 732105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockReleasedLocked(uid); 734105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 735105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 7366ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 7376ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStarted(int uid) { 738105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 739105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 7406ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedLocked(uid); 741105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 742105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 7436ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 7446ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStopped(int uid) { 745105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 746105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 7476ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedLocked(uid); 748105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 749105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabled(int uid) { 7525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 7535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 7545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastEnabledLocked(uid); 7555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 7565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 7575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 7585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabled(int uid) { 7595347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 7605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 7615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastDisabledLocked(uid); 7625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 7635347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 7645347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 7657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSource(WorkSource ws) { 7667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockAcquiredFromSourceLocked(ws); 7697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 7727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSource(WorkSource ws) { 7737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockReleasedFromSourceLocked(ws); 7767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 7796ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedFromSource(WorkSource ws) { 7807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7826ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedFromSourceLocked(ws); 7837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 7866ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedFromSource(WorkSource ws) { 7877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7896ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedFromSourceLocked(ws); 7907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 793a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) { 794a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 795a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 796a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph); 797a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 798a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 799a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 800a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) { 801a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 802a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 803a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws); 804a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 805a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 806a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 8077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSource(WorkSource ws) { 8087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastEnabledFromSourceLocked(ws); 8117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 8157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSource(WorkSource ws) { 8167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastDisabledFromSourceLocked(ws); 8197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8227a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 8234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void noteNetworkInterfaceType(String iface, int networkType) { 8241059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey enforceCallingPermission(); 8251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (mStats) { 8264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.noteNetworkInterfaceTypeLocked(iface, networkType); 8271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 8281059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 8291059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 8307a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 8317a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey public void noteNetworkStatsEnabled() { 8327a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey enforceCallingPermission(); 8337a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey synchronized (mStats) { 8347a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey mStats.noteNetworkStatsEnabledLocked(); 8357a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 8367a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 8377a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey 8388ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn @Override 83908c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) { 8408ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 8418ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 84208c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid); 8438ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8448ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8458ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 8468ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageInstalled(String pkgName, int versionCode) { 8478ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 8488ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 8498ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageInstalledLocked(pkgName, versionCode); 8508ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8518ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8528ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 8538ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageUninstalled(String pkgName) { 8548ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 8558ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 8568ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageUninstalledLocked(pkgName); 8578ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8588ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8598ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.isOnBattery(); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 864d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski @Override 865d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski public void setBatteryState(final int status, final int health, final int plugType, 866d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski final int level, final int temp, final int volt) { 867d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski enforceCallingPermission(); 868d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 869d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // BatteryService calls us here and we may update external state. It would be wrong 870d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // to block such a low level service like BatteryService on external stats like WiFi. 871d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski mHandler.post(new Runnable() { 872d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski @Override 873d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski public void run() { 874d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski synchronized (mStats) { 875d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE; 876d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski if (mStats.isOnBattery() == onBattery) { 877d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // The battery state has not changed, so we don't need to sync external 878d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // stats immediately. 879d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt); 880d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski return; 881d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 882d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 883d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 884d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // Sync external stats first as the battery has changed states. If we don't sync 885d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // immediately here, we may not collect the relevant data later. 886d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski updateExternalStats("battery-state", UPDATE_ALL); 887d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski synchronized (mStats) { 888d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt); 889d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 890d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 891d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski }); 892633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 893633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimeBattery(); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimePlugged(); 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission() { 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS, 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingPid(), Binder.getCallingUid(), null); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 913c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 914c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final class WakeupReasonThread extends Thread { 915515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static final int MAX_REASON_SIZE = 512; 916515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharsetDecoder mDecoder; 917515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private ByteBuffer mUtf8Buffer; 918515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharBuffer mUtf16Buffer; 919c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 920c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn WakeupReasonThread() { 921c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn super("BatteryStats_wakeupReason"); 922c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 923c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 924c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn public void run() { 925c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND); 926c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 927515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder = StandardCharsets.UTF_8 928515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .newDecoder() 929515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onMalformedInput(CodingErrorAction.REPLACE) 930515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onUnmappableCharacter(CodingErrorAction.REPLACE) 931515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .replaceWith("?"); 932515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 933515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE); 934515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE); 935515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 936c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn try { 937515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski String reason; 938515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski while ((reason = waitWakeup()) != null) { 939c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn synchronized (mStats) { 940515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mStats.noteWakeupReasonLocked(reason); 941c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 942c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 943c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } catch (RuntimeException e) { 944c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Slog.e(TAG, "Failure reading wakeup reasons", e); 945c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 946c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 947515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 948515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private String waitWakeup() { 949515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.clear(); 950515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.clear(); 951515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.reset(); 952515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 953515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski int bytesWritten = nativeWaitWakeup(mUtf8Buffer); 954515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (bytesWritten < 0) { 955515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return null; 956515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } else if (bytesWritten == 0) { 957515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return "unknown"; 958515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 959515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 960515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Set the buffer's limit to the number of bytes written. 961515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.limit(bytesWritten); 962515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 963515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Decode the buffer from UTF-8 to UTF-16. 964515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Unmappable characters will be replaced. 965515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true); 966515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.flip(); 967515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 968515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Create a String from the UTF-16 buffer. 969515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return mUtf16Buffer.toString(); 970515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 971c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 972c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 973515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static native int nativeWaitWakeup(ByteBuffer outBuffer); 974c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 975ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn private void dumpHelp(PrintWriter pw) { 97691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn pw.println("Battery stats (batterystats) dump options:"); 9771e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn pw.println(" [--checkin] [--history] [--history-start] [--charged] [-c]"); 978d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]"); 979865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" --checkin: generate output for a checkin report; will write (and clear) the"); 980865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" last old completed stats when they had been reset."); 981865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" --c: write the current stats in checkin format."); 982099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn pw.println(" --history: show only history data."); 983c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --history-start <num>: show only history data starting at given time offset."); 984c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --charged: only output data since last charged."); 985d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --daily: only output full daily data."); 986ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --reset: reset the stats, clearing all current data."); 987ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --write: force write current collected stats to disk."); 988d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --new-daily: immediately create and write new daily stats record."); 989d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --read-daily: read-load last written daily stats."); 990cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println(" <package.name>: optional name of package to filter output by."); 991fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" -h: print this help text."); 992fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println("Battery stats (batterystats) commands:"); 993fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" enable|disable <option>"); 994fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Enable or disable a running option. Option state is not saved across boots."); 995fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Options are:"); 9960068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn pw.println(" full-history: include additional detailed events in battery history:"); 9971e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn pw.println(" wake_lock_in, alarms and proc events"); 998fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" no-auto-reset: don't automatically reset stats when unplugged"); 999ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 1000ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 1001cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) { 1002cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i++; 1003cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i >= args.length) { 1004cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Missing option argument for " + (enable ? "--enable" : "--disable")); 1005cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1006cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1007cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 10080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) { 1009cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 10100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.setRecordAllHistoryLocked(enable); 1011cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 10129a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } else if ("no-auto-reset".equals(args[i])) { 10139a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn synchronized (mStats) { 10149a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn mStats.setNoAutoReset(enable); 10159a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } 1016cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else { 1017cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Unknown enable/disable option: " + args[i]); 1018cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1019cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1020cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1021cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return i; 1022cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1023cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 10244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 10273abd75ba3a981850cac43a401d0014a836559cb0Kenny Root if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 10283abd75ba3a981850cac43a401d0014a836559cb0Kenny Root != PackageManager.PERMISSION_GRANTED) { 10293abd75ba3a981850cac43a401d0014a836559cb0Kenny Root pw.println("Permission Denial: can't dump BatteryStats from from pid=" 10303abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() 10313abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + " without permission " + android.Manifest.permission.DUMP); 10323abd75ba3a981850cac43a401d0014a836559cb0Kenny Root return; 10333abd75ba3a981850cac43a401d0014a836559cb0Kenny Root } 10343abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 1035c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn int flags = 0; 10360068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean useCheckinFormat = false; 10370068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean isRealCheckin = false; 10380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean noOutput = false; 103916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn boolean writeData = false; 1040c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn long historyStart = -1; 1041cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn int reqUid = -1; 1042e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (args != null) { 1043c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn for (int i=0; i<args.length; i++) { 1044c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn String arg = args[i]; 1045e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ("--checkin".equals(arg)) { 10460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 10470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn isRealCheckin = true; 1048099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } else if ("--history".equals(arg)) { 1049c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1050c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--history-start".equals(arg)) { 1051c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1052c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn i++; 1053c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (i >= args.length) { 1054c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println("Missing time argument for --history-since"); 1055c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn dumpHelp(pw); 1056c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn return; 1057c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1058c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn historyStart = Long.parseLong(args[i]); 105916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn writeData = true; 106049021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn } else if ("-c".equals(arg)) { 10610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 1062c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_INCLUDE_HISTORY; 1063c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--charged".equals(arg)) { 1064c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1065d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--daily".equals(arg)) { 1066d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn flags |= BatteryStats.DUMP_DAILY_ONLY; 1067e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("--reset".equals(arg)) { 1068e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 10693d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn mStats.resetAllStatsCmdLocked(); 1070e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pw.println("Battery stats reset."); 10710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1073a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateExternalStats("dump", UPDATE_ALL); 10740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ("--write".equals(arg)) { 1075a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateExternalStats("dump", UPDATE_ALL); 10760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn synchronized (mStats) { 10770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mStats.writeSyncLocked(); 10780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Battery stats written."); 10790ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 10800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 1081d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--new-daily".equals(arg)) { 1082d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1083d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.recordDailyStatsLocked(); 1084d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("New daily stats written."); 1085d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1086d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1087d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--read-daily".equals(arg)) { 1088d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1089d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.readDailyStatsLocked(); 1090d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("Last daily stats read."); 1091d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1092d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1093fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--enable".equals(arg) || "enable".equals(arg)) { 1094cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, true); 1095cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1096cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1097cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1098cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Enabled: " + args[i]); 1099cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1100fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--disable".equals(arg) || "disable".equals(arg)) { 1101cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, false); 1102cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1103cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1104cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1105cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Disabled: " + args[i]); 1106cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1107ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } else if ("-h".equals(arg)) { 1108ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1109ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn return; 1110e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood } else if ("-a".equals(arg)) { 1111a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn flags |= BatteryStats.DUMP_VERBOSE; 1112cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else if (arg.length() > 0 && arg.charAt(0) == '-'){ 11130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Unknown option: " + arg); 1114ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1115cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1116cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else { 1117cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn // Not an option, last argument must be a package name. 1118cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn try { 1119e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey reqUid = mContext.getPackageManager().getPackageUidAsUser(arg, 1120cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn UserHandle.getCallingUserId()); 1121cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 1122cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println("Unknown package: " + arg); 1123cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn dumpHelp(pw); 1124cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1125cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1128e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 11290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (noOutput) { 11300ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 11310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 113213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 113313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn long ident = Binder.clearCallingIdentity(); 113413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn try { 113513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn if (BatteryStatsHelper.checkWifiOnly(mContext)) { 113613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY; 113713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } 113813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn // Fetch data from external sources and update the BatteryStatsImpl object with them. 1139a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski updateExternalStats("dump", UPDATE_ALL); 114013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } finally { 114113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn Binder.restoreCallingIdentity(ident); 1142d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn } 114313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 1144ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn if (reqUid >= 0) { 1145ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // By default, if the caller is only interested in a specific package, then 1146ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // we only dump the aggregated data since charged. 11471e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) { 1148ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1149ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // Also if they are doing -c, we don't want history. 1150ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY; 1151ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 1152ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 11534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (useCheckinFormat) { 1155e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0); 11560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (isRealCheckin) { 11570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // For a real checkin, first we want to prefer to use the last complete checkin 11580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // file if there is one. 11590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn synchronized (mStats.mCheckinFile) { 11600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (mStats.mCheckinFile.exists()) { 11610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 11620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] raw = mStats.mCheckinFile.readFully(); 11630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (raw != null) { 11640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel in = Parcel.obtain(); 11650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.unmarshall(raw, 0, raw.length); 11660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.setDataPosition(0); 11670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsImpl checkinStats = new BatteryStatsImpl( 11684b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski null, mStats.mHandler, null); 11690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.readSummaryFromParcel(in); 11700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.recycle(); 11710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.dumpCheckinLocked(mContext, pw, apps, flags, 11720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn historyStart); 11730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.mCheckinFile.delete(); 11740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return; 11750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 11769ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski } catch (IOException | ParcelFormatException e) { 11770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Failure reading checkin file " 11780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn + mStats.mCheckinFile.getBaseFile(), e); 11790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 11800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 11810068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 11820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 1183e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1184c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart); 118516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 118616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 118716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1188e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1189e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 1190e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1191c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart); 119216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 119316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 119416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1195e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Objects for extracting data from external sources. 12004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private final Object mExternalStatsLock = new Object(); 12014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 12024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @GuardedBy("mExternalStatsLock") 12034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private IWifiManager mWifiManager; 12044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 12054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // WiFi keeps an accumulated total of stats, unlike Bluetooth. 12064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Keep the last WiFi stats so we can compute a delta. 12074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @GuardedBy("mExternalStatsLock") 12084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private WifiActivityEnergyInfo mLastInfo = new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0); 12094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 12104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @GuardedBy("mExternalStatsLock") 12114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private WifiActivityEnergyInfo pullWifiEnergyInfoLocked() { 12124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (mWifiManager == null) { 12134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mWifiManager = IWifiManager.Stub.asInterface( 12144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski ServiceManager.getService(Context.WIFI_SERVICE)); 12154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (mWifiManager == null) { 12164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return null; 12174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 12184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 12194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 12204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski try { 12214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // We read the data even if we are not on battery. This is so that we keep the 12224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // correct delta from when we should start reading (aka when we are on battery). 12234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski WifiActivityEnergyInfo info = mWifiManager.reportActivityInfo(); 12244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (info != null && info.isValid()) { 1225f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski if (info.mControllerEnergyUsed < 0 || info.mControllerIdleTimeMs < 0 || 1226f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski info.mControllerRxTimeMs < 0 || info.mControllerTxTimeMs < 0) { 1227f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski Slog.wtf(TAG, "Reported WiFi energy data is invalid: " + info); 1228f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski return null; 1229f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski } 1230f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski 1231bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski final long timePeriodMs = info.mTimestamp - mLastInfo.mTimestamp; 1232bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski final long lastIdleMs = mLastInfo.mControllerIdleTimeMs; 1233bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski final long lastTxMs = mLastInfo.mControllerTxTimeMs; 1234bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski final long lastRxMs = mLastInfo.mControllerRxTimeMs; 1235bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski final long lastEnergy = mLastInfo.mControllerEnergyUsed; 1236bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski 12374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // We will modify the last info object to be the delta, and store the new 12384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // WifiActivityEnergyInfo object as our last one. 12394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski final WifiActivityEnergyInfo result = mLastInfo; 12404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski result.mTimestamp = info.getTimeStamp(); 12414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski result.mStackState = info.getStackState(); 1242f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski 1243f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski // These times seem to be the most reliable. 1244bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski result.mControllerTxTimeMs = info.mControllerTxTimeMs - lastTxMs; 1245bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski result.mControllerRxTimeMs = info.mControllerRxTimeMs - lastRxMs; 1246e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 1247e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // WiFi calculates the idle time as a difference from the on time and the various 1248e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Rx + Tx times. There seems to be some missing time there because this sometimes 1249e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // becomes negative. Just cap it at 0 and move on. 1250f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski // b/21613534 1251bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski result.mControllerIdleTimeMs = Math.max(0, info.mControllerIdleTimeMs - lastIdleMs); 1252f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski result.mControllerEnergyUsed = 1253bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski Math.max(0, info.mControllerEnergyUsed - lastEnergy); 1254e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 1255e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski if (result.mControllerTxTimeMs < 0 || 1256e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerRxTimeMs < 0) { 1257e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // The stats were reset by the WiFi system (which is why our delta is negative). 1258e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Returns the unaltered stats. 1259e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerEnergyUsed = info.mControllerEnergyUsed; 1260e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerRxTimeMs = info.mControllerRxTimeMs; 1261e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerTxTimeMs = info.mControllerTxTimeMs; 1262e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerIdleTimeMs = info.mControllerIdleTimeMs; 1263e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 1264e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + result); 1265e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 1266bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski 1267590da11a85d6e5201f3a96be7d30950e4b9178e5Todd Kennedy // There is some accuracy error in reports so allow some slop in the results. 1268590da11a85d6e5201f3a96be7d30950e4b9178e5Todd Kennedy final long SAMPLE_ERROR_MILLIS = 750; 1269bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski final long totalTimeMs = result.mControllerIdleTimeMs + result.mControllerRxTimeMs + 1270bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski result.mControllerTxTimeMs; 12714c9ace51db6ded47665cbafce3edf8a92a67f775Adam Lesinski if (totalTimeMs > timePeriodMs + SAMPLE_ERROR_MILLIS) { 1272bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski StringBuilder sb = new StringBuilder(); 1273bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append("Total time "); 1274bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski TimeUtils.formatDuration(totalTimeMs, sb); 1275bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append(" is longer than sample period "); 1276bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski TimeUtils.formatDuration(timePeriodMs, sb); 1277bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append(".\n"); 1278bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append("Previous WiFi snapshot: ").append("idle="); 1279bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski TimeUtils.formatDuration(lastIdleMs, sb); 1280bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append(" rx="); 1281bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski TimeUtils.formatDuration(lastRxMs, sb); 1282bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append(" tx="); 1283bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski TimeUtils.formatDuration(lastTxMs, sb); 1284bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append(" e=").append(lastEnergy); 1285bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append("\n"); 1286bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append("Current WiFi snapshot: ").append("idle="); 1287bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski TimeUtils.formatDuration(info.mControllerIdleTimeMs, sb); 1288bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append(" rx="); 1289bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski TimeUtils.formatDuration(info.mControllerRxTimeMs, sb); 1290bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append(" tx="); 1291bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski TimeUtils.formatDuration(info.mControllerTxTimeMs, sb); 1292bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski sb.append(" e=").append(info.mControllerEnergyUsed); 1293bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski Slog.wtf(TAG, sb.toString()); 1294bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski } 1295bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski 12964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mLastInfo = info; 12974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return result; 12984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 12994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } catch (RemoteException e) { 13004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Nothing to report, WiFi is dead. 13014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 13024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return null; 13034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 13044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 13054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @GuardedBy("mExternalStatsLock") 13064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private BluetoothActivityEnergyInfo pullBluetoothEnergyInfoLocked() { 13074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 13084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (adapter != null) { 13094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski BluetoothActivityEnergyInfo info = adapter.getControllerActivityEnergyInfo( 13104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski BluetoothAdapter.ACTIVITY_ENERGY_INFO_REFRESHED); 13114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (info != null && info.isValid()) { 13128a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski if (info.getControllerEnergyUsed() < 0 || info.getControllerIdleTimeMillis() < 0 || 13138a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski info.getControllerRxTimeMillis() < 0 || info.getControllerTxTimeMillis() < 0) { 13148a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski Slog.wtf(TAG, "Bluetooth energy data is invalid: " + info); 13158a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski } 13164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return info; 13174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 13184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 13194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return null; 13204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 13214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 132221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski @GuardedBy("mExternalStatsLock") 132321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski private ModemActivityInfo pullModemActivityInfoLocked() { 132421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski ITelephony tm = ITelephony.Stub.asInterface(ServiceManager.getService( 132521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski Context.TELEPHONY_SERVICE)); 132621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski try { 132721f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski if (tm != null) { 132821f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski ModemActivityInfo info = tm.getModemActivityInfo(); 132921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski if (info == null || info.isValid()) { 133021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski return info; 133121f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 133221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski Slog.wtf(TAG, "Modem activity info is invalid: " + info); 133321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 133421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } catch (RemoteException e) { 133521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski // Nothing to do. 133621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 133721f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski return null; 133821f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 133921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski 13404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 13414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates 13424b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * batterystats with that information. 13434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * 13444b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * We first grab a lock specific to this method, then once all the data has been collected, 13454b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * we grab the mStats lock and update the data. 1346c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski * 1347c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski * @param reason The reason why this collection was requested. Useful for debugging. 1348a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski * @param updateFlags Which external stats to update. Can be a combination of 1349a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski * {@link #UPDATE_CPU}, {@link #UPDATE_RADIO}, {@link #UPDATE_WIFI}, 1350a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski * and {@link #UPDATE_BT}. 13514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 1352a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski void updateExternalStats(final String reason, final int updateFlags) { 13534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mExternalStatsLock) { 1354e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski if (mContext == null) { 1355e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // We haven't started yet (which means the BatteryStatsImpl object has 1356e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // no power profile. Don't consume data we can't compute yet. 1357e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski return; 1358e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 1359e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 1360a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if (BatteryStatsImpl.DEBUG_ENERGY) { 1361a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski Slog.d(TAG, "Updating external stats: reason=" + reason); 1362a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1363a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1364a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski WifiActivityEnergyInfo wifiEnergyInfo = null; 1365a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if ((updateFlags & UPDATE_WIFI) != 0) { 1366a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski wifiEnergyInfo = pullWifiEnergyInfoLocked(); 1367a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1368a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 136921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski ModemActivityInfo modemActivityInfo = null; 137021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski if ((updateFlags & UPDATE_RADIO) != 0) { 137121f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski modemActivityInfo = pullModemActivityInfoLocked(); 137221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski } 137321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski 1374a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski BluetoothActivityEnergyInfo bluetoothEnergyInfo = null; 1375a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if ((updateFlags & UPDATE_BT) != 0) { 1376c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski // We only pull bluetooth stats when we have to, as we are not distributing its 1377c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski // use amongst apps and the sampling frequency does not matter. 1378c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski bluetoothEnergyInfo = pullBluetoothEnergyInfoLocked(); 1379c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski } 1380c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski 13814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 1382a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final long elapsedRealtime = SystemClock.elapsedRealtime(); 1383a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski final long uptime = SystemClock.uptimeMillis(); 13840c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn if (mStats.mRecordAllHistory) { 13850c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn mStats.addHistoryEventLocked(elapsedRealtime, uptime, 13860c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, reason, 0); 13870c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn } 138872478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski 1389a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if ((updateFlags & UPDATE_CPU) != 0) { 1390a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mStats.updateCpuTimeLocked(); 1391a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mStats.updateKernelWakelocksLocked(); 1392a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1393a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1394a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if ((updateFlags & UPDATE_RADIO) != 0) { 139521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski mStats.updateMobileRadioStateLocked(elapsedRealtime, modemActivityInfo); 1396a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1397a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1398a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if ((updateFlags & UPDATE_WIFI) != 0) { 1399a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mStats.updateWifiStateLocked(wifiEnergyInfo); 1400a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 1401a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski 1402a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if ((updateFlags & UPDATE_BT) != 0) { 1403a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski mStats.updateBluetoothStateLocked(bluetoothEnergyInfo); 140472478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski } 14054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 14064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 14074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1409