BatteryStatsService.java revision 1e38382b542f5cef9957a89692b02c55a3dd351c
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; 2114fb81af281468735bed1da99931ecc5a0539344Amith Yamasaniimport android.bluetooth.BluetoothHeadset; 223f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothProfile; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 24e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo; 253abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager; 264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.IWifiManager; 274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo; 2891268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 306f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Looper; 334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Message; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 350068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor; 36cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 40e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock; 41cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle; 427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 43e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo; 44e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 45e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager; 468a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy; 4932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats; 50d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper; 5132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl; 52e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile; 534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.server.FgThread; 54cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices; 5532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File; 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 60e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 66cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub 67cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn implements PowerManagerInternal.LowPowerModeListener { 68c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn static final String TAG = "BatteryStatsService"; 69c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static IBatteryStats sService; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl mStats; 724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski final BatteryStatsHandler mHandler; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context mContext; 743f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh private boolean mBluetoothPendingStats; 753f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh private BluetoothHeadset mBluetoothHeadset; 76cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn PowerManagerInternal mPowerManagerInternal; 773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync { 794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public static final int MSG_SYNC_EXTERNAL_STATS = 1; 804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public static final int MSG_WRITE_TO_DISK = 2; 814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public BatteryStatsHandler(Looper looper) { 834b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski super(looper); 844b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 854b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 864b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 874b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void handleMessage(Message msg) { 884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski switch (msg.what) { 894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski case MSG_SYNC_EXTERNAL_STATS: 904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski updateExternalStats(); 914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski break; 924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski case MSG_WRITE_TO_DISK: 944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski updateExternalStats(); 954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeAsyncLocked(); 974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski break; 994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 1034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void scheduleSync() { 1044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (!hasMessages(MSG_SYNC_EXTERNAL_STATS)) { 1054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski sendEmptyMessage(MSG_SYNC_EXTERNAL_STATS); 1064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsService(File systemDir, Handler handler) { 1114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Our handler here will be accessing the disk, use a different thread than 1124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // what the ActivityManagerService gave us (no I/O on that one!). 1134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mHandler = new BatteryStatsHandler(FgThread.getHandler().getLooper()); 1144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through. 1164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats = new BatteryStatsImpl(systemDir, handler, mHandler); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void publish(Context context) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 12191268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder()); 122e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps()); 123f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mStats.setRadioScanningTimeout(mContext.getResources().getInteger( 124f37447bad3773b62176baa837908daf6edb44273Amith Yamasani com.android.internal.R.integer.config_radioScanningTimeout) 125f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * 1000L); 126e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski mStats.setPowerProfile(new PowerProfile(context)); 1272c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 1282c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 1292c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown /** 1302c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * At the time when the constructor runs, the power manager has not yet been 1312c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * initialized. So we initialize the low power observer later. 1322c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown */ 1332c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown public void initPowerManagement() { 134cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); 135cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mPowerManagerInternal.registerLowPowerModeObserver(this); 1368ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePowerSaveMode(mPowerManagerInternal.getLowPowerModeEnabled()); 137c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn (new WakeupReasonThread()).start(); 1382c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 1392c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 14055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn public void shutdown() { 1418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w("BatteryStats", "Writing battery stats before shutdown..."); 1424b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski updateExternalStats(); 14455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn synchronized (mStats) { 1456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.shutdownLocked(); 14655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 14755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 14855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static IBatteryStats getService() { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15391268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = asInterface(b); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 157cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 158cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn @Override 159cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void onLowPowerModeChanged(boolean enabled) { 160cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 1618ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePowerSaveMode(enabled); 162cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 163cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 164cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current statistics object, which may be modified 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to reflect events that affect battery usage. You must lock the 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stats object before doing anything with it. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getActiveStatistics() { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 1744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 1754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Schedules a write to disk to occur. This will cause the BatteryStatsImpl 1764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * object to update with the latest info, then write to disk. 1774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 1784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void scheduleWriteToDisk() { 1794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK); 1804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 1814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1822f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // These are for direct use by the activity manager... 1832f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 1842f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void addIsolatedUid(int isolatedUid, int appUid) { 1852f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 1862f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.addIsolatedUidLocked(isolatedUid, appUid); 1872f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 1882f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 1892f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 1902f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void removeIsolatedUid(int isolatedUid, int appUid) { 1912f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 1922f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.removeIsolatedUidLocked(isolatedUid, appUid); 1932f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 1942f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 1952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 1962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void noteProcessStart(String name, int uid) { 1972f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 1982f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.noteProcessStartLocked(name, uid); 1992f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2021e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessCrash(String name, int uid) { 2031e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 2041e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessCrashLocked(name, uid); 2051e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 2061e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 2071e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 2081e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessAnr(String name, int uid) { 2091e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 2101e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessAnrLocked(name, uid); 2111e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 2121e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 2131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 2142f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void noteProcessState(String name, int uid, int state) { 2152f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 2162f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.noteProcessStateLocked(name, uid, state); 2172f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2192f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2202f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void noteProcessFinish(String name, int uid) { 2212f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 2222f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.noteProcessFinishLocked(name, uid); 2232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2242f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2252f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // Public interface... 2272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getStatistics() { 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingPermission( 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 2318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i("foo", "SENDING BATTERY INFO:"); 2328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 2344b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski updateExternalStats(); 2354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 2364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 2374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = out.marshall(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2420068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 2430068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn public ParcelFileDescriptor getStatisticsStream() { 2440068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mContext.enforceCallingPermission( 2450068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn android.Manifest.permission.BATTERY_STATS, null); 2460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //Slog.i("foo", "SENDING BATTERY INFO:"); 2470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 2480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel out = Parcel.obtain(); 2494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski updateExternalStats(); 2504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 2514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 2524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 2530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] data = out.marshall(); 2540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn out.recycle(); 2550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 2560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return ParcelFileDescriptor.fromData(data, "battery-stats"); 2570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } catch (IOException e) { 2580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Unable to create shared memory", e); 2590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return null; 2600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 2610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 2620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 2634870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn public boolean isCharging() { 2644870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn synchronized (mStats) { 2654870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn return mStats.isCharging(); 2664870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 2674870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 2684870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn 269ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeBatteryTimeRemaining() { 270ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 271ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime()); 272ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 273ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 274ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 275ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 276ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeChargeTimeRemaining() { 277ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 278ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime()); 279ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 280ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 281ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 282ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 283099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn public void noteEvent(int code, String name, int uid) { 284099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn enforceCallingPermission(); 285099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn synchronized (mStats) { 286099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn mStats.noteEventLocked(code, name, uid); 287099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 288099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 289099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 290fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncStart(String name, int uid) { 291fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 292fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 293fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncStartLocked(name, uid); 294fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 295fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 296fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 297fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncFinish(String name, int uid) { 298fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 299fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 300fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncFinishLocked(name, uid); 301fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 302fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 303fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 304fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobStart(String name, int uid) { 305fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 306fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 307fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobStartLocked(name, uid); 308fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 309fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 310fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 311fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobFinish(String name, int uid) { 312fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 313fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 314fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobFinishLocked(name, uid); 315fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 316fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 317fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 3181e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmStart(String name, int uid) { 3191e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 3201e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 3211e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmStartLocked(name, uid); 3221e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 3231e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 3241e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 3251e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmFinish(String name, int uid) { 3261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 3271e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 3281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmFinishLocked(name, uid); 3291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 3301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 3311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 332a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelock(int uid, int pid, String name, String historyName, int type, 3333d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn boolean unimportantForLogging) { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 336e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging, 33740c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 341cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 344cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeLocked(uid, pid, name, historyName, type, 345cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelockFromSource(WorkSource ws, int pid, String name, 350a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn String historyName, int type, boolean unimportantForLogging) { 3517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 3527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 353a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName, 354a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn type, unimportantForLogging); 3557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 358cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name, 359cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn String historyName, int type, WorkSource newWs, int newPid, String newName, 360e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn String newHistoryName, int newType, boolean newUnimportantForLogging) { 361e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn enforceCallingPermission(); 362e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn synchronized (mStats) { 363cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type, 364e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging); 365e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 366e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 367e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 368cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName, 369cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn int type) { 3707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 3717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 372cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type); 3737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int uid, int sensor) { 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 3799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStartSensorLocked(uid, sensor); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int uid, int sensor) { 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 3869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStopSensorLocked(uid, sensor); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 390a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOn(int uid, long durationMillis) { 391a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 392a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 393a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOnLocked(uid, durationMillis); 394a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 395a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 396a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 397a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOff(int uid) { 398a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 399a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 400a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOffLocked(uid); 401a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 402a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 403a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 4076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStartGpsLocked(uid); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 4146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStopGpsLocked(uid); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 418e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteScreenState(int state) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 421e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteScreenStateLocked(state); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 425617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightness(int brightness) { 426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 427617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 428617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteScreenBrightnessLocked(brightness); 429617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 430617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 432e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteUserActivity(int uid, int event) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 435e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteUserActivityLocked(uid, event); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 438617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 439e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteInteractive(boolean interactive) { 440617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 441617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 442e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteInteractiveLocked(interactive); 443617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 444617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 445e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 4461e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn public void noteConnectivityChanged(int type, String extra) { 4471e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn enforceCallingPermission(); 4481e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 4491e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteConnectivityChangedLocked(type, extra); 4501e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 4511e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 4521e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 4532ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn public void noteMobileRadioPowerState(int powerState, long timestampNs) { 454e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn enforceCallingPermission(); 455e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn synchronized (mStats) { 4562ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn mStats.noteMobileRadioPowerState(powerState, timestampNs); 457e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 458e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 459e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOn() { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOnLocked(); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOff() { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOffLocked(); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 473105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 474e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrength(SignalStrength signalStrength) { 475627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 476627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 477e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mStats.notePhoneSignalStrengthLocked(signalStrength); 478627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 479627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 480627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 481627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionState(int dataType, boolean hasData) { 482627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 483627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 484627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mStats.notePhoneDataConnectionStateLocked(dataType, hasData); 485627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 486627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 48732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 488f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneState(int state) { 48932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani enforceCallingPermission(); 490e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int simState = TelephonyManager.getDefault().getSimState(); 49132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani synchronized (mStats) { 492e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mStats.notePhoneStateLocked(state, simState); 49332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 49432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 49532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 49658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOn() { 497105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 498105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 49958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOnLocked(); 500105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 501105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 502105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 50358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOff() { 504105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 505105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 50658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOffLocked(); 507105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 508105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 509d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 510244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartAudio(int uid) { 511244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 512244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 513244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOnLocked(uid); 514244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 515244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 516244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 517244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopAudio(int uid) { 518244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 519244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 520244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOffLocked(uid); 521244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 522244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 523244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 524244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartVideo(int uid) { 525244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 526244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 527244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOnLocked(uid); 528244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 529244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 530244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 531244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopVideo(int uid) { 532244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 533244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 534244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOffLocked(uid); 535244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 536244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 537244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 53810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetAudio() { 53910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 54010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 54110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetAudioLocked(); 54210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 54310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 54410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 54510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetVideo() { 54610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 54710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 54810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetVideoLocked(); 54910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 55010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 55110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 552abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn public void noteFlashlightOn() { 553abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 554abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 555abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn mStats.noteFlashlightOnLocked(); 556abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 557abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 558abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 559abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn public void noteFlashlightOff() { 560abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 561abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 562abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn mStats.noteFlashlightOffLocked(); 563abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 564abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 565abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 566e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski @Override 567e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski public void noteWifiRadioPowerState(int powerState, long tsNanos) { 568e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski enforceCallingPermission(); 569e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 570e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // There was a change in WiFi power state. 571e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Collect data now for the past activity. 572e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski mHandler.scheduleSync(); 573e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 574e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 57558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunning(WorkSource ws) { 576d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 577d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 57858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningLocked(ws); 579d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 580d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 581d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 58258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) { 583d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 584d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 58558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningChangedLocked(oldWs, newWs); 58658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 58758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 58858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 58958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStopped(WorkSource ws) { 59058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn enforceCallingPermission(); 59158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn synchronized (mStats) { 59258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiStoppedLocked(ws); 593d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 594d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 595d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 596ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn public void noteWifiState(int wifiState, String accessPoint) { 597ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn enforceCallingPermission(); 598ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn synchronized (mStats) { 599ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn mStats.noteWifiStateLocked(wifiState, accessPoint); 600ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 601ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 602ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn 6033251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) { 6043251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 6053251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 6063251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth); 6073251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 6083251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 6093251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 6103251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiRssiChanged(int newRssi) { 6113251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 6123251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 6133251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiRssiChangedLocked(newRssi); 6143251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 6153251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 6163251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 617105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOn() { 618105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 6193f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 6203f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh if (adapter != null) { 6213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener, 6223f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh BluetoothProfile.HEADSET); 6233f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 624105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 6253f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh if (mBluetoothHeadset != null) { 6263f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.noteBluetoothOnLocked(); 6273f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.setBtHeadset(mBluetoothHeadset); 6283f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } else { 6293f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothPendingStats = true; 6303f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 631105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 632105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 6333f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh 6343f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener = 6353f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh new BluetoothProfile.ServiceListener() { 6363f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh public void onServiceConnected(int profile, BluetoothProfile proxy) { 6373f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothHeadset = (BluetoothHeadset) proxy; 6383f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh synchronized (mStats) { 6393f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh if (mBluetoothPendingStats) { 6403f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.noteBluetoothOnLocked(); 6413f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.setBtHeadset(mBluetoothHeadset); 6423f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothPendingStats = false; 6433f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 6443f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 6453f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 6463f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh 6473f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh public void onServiceDisconnected(int profile) { 6483f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothHeadset = null; 6493f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 6503f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh }; 6513f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh 652105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOff() { 653105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 654105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 6553f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothPendingStats = false; 656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteBluetoothOffLocked(); 657105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 658105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 659105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 660ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn public void noteBluetoothState(int bluetoothState) { 661e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn enforceCallingPermission(); 662e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn synchronized (mStats) { 663ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn mStats.noteBluetoothStateLocked(bluetoothState); 664e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 665e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 666e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 667105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquired(int uid) { 668105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 669105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 670105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockAcquiredLocked(uid); 671105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 672105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 673105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 674105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleased(int uid) { 675105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 677105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockReleasedLocked(uid); 678105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 679105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 6806ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 6816ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStarted(int uid) { 682105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 683105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 6846ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedLocked(uid); 685105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 686105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 6876ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 6886ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStopped(int uid) { 689105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 690105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 6916ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedLocked(uid); 692105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 693105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabled(int uid) { 6965347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 6975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 6985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastEnabledLocked(uid); 6995347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 7005347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 7015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 7025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabled(int uid) { 7035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 7045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 7055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastDisabledLocked(uid); 7065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 7075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 7085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 7097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSource(WorkSource ws) { 7107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockAcquiredFromSourceLocked(ws); 7137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 7167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSource(WorkSource ws) { 7177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockReleasedFromSourceLocked(ws); 7207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 7236ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedFromSource(WorkSource ws) { 7247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7266ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedFromSourceLocked(ws); 7277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 7306ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedFromSource(WorkSource ws) { 7317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7336ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedFromSourceLocked(ws); 7347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 737a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) { 738a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 739a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 740a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph); 741a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 742a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 743a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 744a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) { 745a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 746a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 747a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws); 748a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 749a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 750a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 7517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSource(WorkSource ws) { 7527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastEnabledFromSourceLocked(ws); 7557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 7584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 7597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSource(WorkSource ws) { 7607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 7617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 7627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastDisabledFromSourceLocked(ws); 7637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 7657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 7667a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 7674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void noteNetworkInterfaceType(String iface, int networkType) { 7681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey enforceCallingPermission(); 7691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (mStats) { 7704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.noteNetworkInterfaceTypeLocked(iface, networkType); 7711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 7721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 7731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 7747a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 7757a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey public void noteNetworkStatsEnabled() { 7767a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey enforceCallingPermission(); 7777a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey synchronized (mStats) { 7787a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey mStats.noteNetworkStatsEnabledLocked(); 7797a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 7807a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 7817a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey 7828ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn @Override 7838ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void noteDeviceIdleMode(boolean enabled, boolean fromActive, boolean fromMotion) { 7848ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 7858ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 7868ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.noteDeviceIdleModeLocked(enabled, fromActive, fromMotion); 7878ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 7888ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 7898ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 7908ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageInstalled(String pkgName, int versionCode) { 7918ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 7928ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 7938ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageInstalledLocked(pkgName, versionCode); 7948ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 7958ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 7968ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 7978ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageUninstalled(String pkgName) { 7988ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 7998ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 8008ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageUninstalledLocked(pkgName); 8018ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8028ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 8038ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.isOnBattery(); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void setBatteryState(int status, int health, int plugType, int level, 8096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int temp, int volt) { 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 8114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 8124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE; 8134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (mStats.isOnBattery() == onBattery) { 8144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // The battery state has not changed, so we don't need to sync external 8154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // stats immediately. 8164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt); 8174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return; 8184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 8194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 8204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 8214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Sync external stats first as the battery has changed states. If we don't sync 8224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // immediately here, we may not collect the relevant data later. 8234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski updateExternalStats(); 8244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 8254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt); 8264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 827633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 828633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimeBattery(); 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimePlugged(); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission() { 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS, 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingPid(), Binder.getCallingUid(), null); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 848c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 849c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final class WakeupReasonThread extends Thread { 850c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final int[] mIrqs = new int[32]; 851c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final String[] mReasons = new String[32]; 852c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 853c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn WakeupReasonThread() { 854c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn super("BatteryStats_wakeupReason"); 855c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 856c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 857c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn public void run() { 858c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND); 859c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 860c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn try { 861c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn int num; 862c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn while ((num=nativeWaitWakeup(mIrqs, mReasons)) >= 0) { 863c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn synchronized (mStats) { 864a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn if (num > 0) { 865a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn for (int i=0; i<num; i++) { 866a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn mStats.noteWakeupReasonLocked(mReasons[i]); 867a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn } 868a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn } else { 869a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn mStats.noteWakeupReasonLocked("unknown"); 870c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 871c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 872c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 873c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } catch (RuntimeException e) { 874c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Slog.e(TAG, "Failure reading wakeup reasons", e); 875c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 876c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 877c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 878c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 879c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn private static native int nativeWaitWakeup(int[] outIrqs, String[] outReasons); 880c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 881ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn private void dumpHelp(PrintWriter pw) { 88291268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn pw.println("Battery stats (batterystats) dump options:"); 8831e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn pw.println(" [--checkin] [--history] [--history-start] [--charged] [-c]"); 884d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]"); 885ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --checkin: format output for a checkin report."); 886099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn pw.println(" --history: show only history data."); 887c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --history-start <num>: show only history data starting at given time offset."); 888c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --charged: only output data since last charged."); 889d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --daily: only output full daily data."); 890ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --reset: reset the stats, clearing all current data."); 891ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --write: force write current collected stats to disk."); 892d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --new-daily: immediately create and write new daily stats record."); 893d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --read-daily: read-load last written daily stats."); 894cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println(" <package.name>: optional name of package to filter output by."); 895fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" -h: print this help text."); 896fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println("Battery stats (batterystats) commands:"); 897fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" enable|disable <option>"); 898fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Enable or disable a running option. Option state is not saved across boots."); 899fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Options are:"); 9000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn pw.println(" full-history: include additional detailed events in battery history:"); 9011e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn pw.println(" wake_lock_in, alarms and proc events"); 902fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" no-auto-reset: don't automatically reset stats when unplugged"); 903ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 904ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 905cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) { 906cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i++; 907cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i >= args.length) { 908cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Missing option argument for " + (enable ? "--enable" : "--disable")); 909cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 910cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 911cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 9120068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) { 913cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 9140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.setRecordAllHistoryLocked(enable); 915cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 9169a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } else if ("no-auto-reset".equals(args[i])) { 9179a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn synchronized (mStats) { 9189a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn mStats.setNoAutoReset(enable); 9199a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } 920cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else { 921cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Unknown enable/disable option: " + args[i]); 922cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 923cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 924cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 925cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return i; 926cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 927cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 9284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 9313abd75ba3a981850cac43a401d0014a836559cb0Kenny Root if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 9323abd75ba3a981850cac43a401d0014a836559cb0Kenny Root != PackageManager.PERMISSION_GRANTED) { 9333abd75ba3a981850cac43a401d0014a836559cb0Kenny Root pw.println("Permission Denial: can't dump BatteryStats from from pid=" 9343abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() 9353abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + " without permission " + android.Manifest.permission.DUMP); 9363abd75ba3a981850cac43a401d0014a836559cb0Kenny Root return; 9373abd75ba3a981850cac43a401d0014a836559cb0Kenny Root } 9383abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 939c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn int flags = 0; 9400068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean useCheckinFormat = false; 9410068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean isRealCheckin = false; 9420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean noOutput = false; 94316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn boolean writeData = false; 944c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn long historyStart = -1; 945cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn int reqUid = -1; 946e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (args != null) { 947c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn for (int i=0; i<args.length; i++) { 948c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn String arg = args[i]; 949e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ("--checkin".equals(arg)) { 9500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 9510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn isRealCheckin = true; 952099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } else if ("--history".equals(arg)) { 953c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 954c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--history-start".equals(arg)) { 955c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 956c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn i++; 957c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (i >= args.length) { 958c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println("Missing time argument for --history-since"); 959c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn dumpHelp(pw); 960c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn return; 961c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 962c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn historyStart = Long.parseLong(args[i]); 96316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn writeData = true; 96449021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn } else if ("-c".equals(arg)) { 9650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 966c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_INCLUDE_HISTORY; 967c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--charged".equals(arg)) { 968c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 969d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--daily".equals(arg)) { 970d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn flags |= BatteryStats.DUMP_DAILY_ONLY; 971e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("--reset".equals(arg)) { 972e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 9733d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn mStats.resetAllStatsCmdLocked(); 974e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pw.println("Battery stats reset."); 9750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski updateExternalStats(); 9780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ("--write".equals(arg)) { 9794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski updateExternalStats(); 9800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn synchronized (mStats) { 9810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mStats.writeSyncLocked(); 9820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Battery stats written."); 9830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 9840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 985d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--new-daily".equals(arg)) { 986d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 987d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.recordDailyStatsLocked(); 988d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("New daily stats written."); 989d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 990d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 991d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--read-daily".equals(arg)) { 992d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 993d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.readDailyStatsLocked(); 994d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("Last daily stats read."); 995d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 996d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 997fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--enable".equals(arg) || "enable".equals(arg)) { 998cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, true); 999cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1000cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1001cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1002cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Enabled: " + args[i]); 1003cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1004fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--disable".equals(arg) || "disable".equals(arg)) { 1005cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, false); 1006cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1007cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1008cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1009cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Disabled: " + args[i]); 1010cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1011ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } else if ("-h".equals(arg)) { 1012ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1013ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn return; 1014e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood } else if ("-a".equals(arg)) { 1015a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn flags |= BatteryStats.DUMP_VERBOSE; 1016cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else if (arg.length() > 0 && arg.charAt(0) == '-'){ 10170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Unknown option: " + arg); 1018ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1019cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1020cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else { 1021cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn // Not an option, last argument must be a package name. 1022cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn try { 1023cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn reqUid = mContext.getPackageManager().getPackageUid(arg, 1024cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn UserHandle.getCallingUserId()); 1025cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 1026cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println("Unknown package: " + arg); 1027cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn dumpHelp(pw); 1028cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1029cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1032e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 10330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (noOutput) { 10340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 10350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 1036d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn if (BatteryStatsHelper.checkWifiOnly(mContext)) { 1037d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY; 1038d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn } 1039ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn if (reqUid >= 0) { 1040ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // By default, if the caller is only interested in a specific package, then 1041ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // we only dump the aggregated data since charged. 10421e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) { 1043ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1044ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // Also if they are doing -c, we don't want history. 1045ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY; 1046ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 1047ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 10484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 10494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Fetch data from external sources and update the BatteryStatsImpl object with them. 10504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski updateExternalStats(); 10514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 10520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (useCheckinFormat) { 1053e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0); 10540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (isRealCheckin) { 10550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // For a real checkin, first we want to prefer to use the last complete checkin 10560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // file if there is one. 10570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn synchronized (mStats.mCheckinFile) { 10580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (mStats.mCheckinFile.exists()) { 10590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 10600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] raw = mStats.mCheckinFile.readFully(); 10610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (raw != null) { 10620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel in = Parcel.obtain(); 10630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.unmarshall(raw, 0, raw.length); 10640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.setDataPosition(0); 10650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsImpl checkinStats = new BatteryStatsImpl( 10664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski null, mStats.mHandler, null); 10670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.readSummaryFromParcel(in); 10680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.recycle(); 10690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.dumpCheckinLocked(mContext, pw, apps, flags, 10700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn historyStart); 10710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.mCheckinFile.delete(); 10720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return; 10730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 10740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } catch (IOException e) { 10750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Failure reading checkin file " 10760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn + mStats.mCheckinFile.getBaseFile(), e); 10770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 10780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 10790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 10800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 1081e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1082c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart); 108316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 108416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 108516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1086e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 1087e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 1088e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1089c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart); 109016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 109116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 109216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1093e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 10974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Objects for extracting data from external sources. 10984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private final Object mExternalStatsLock = new Object(); 10994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @GuardedBy("mExternalStatsLock") 11014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private IWifiManager mWifiManager; 11024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // WiFi keeps an accumulated total of stats, unlike Bluetooth. 11044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Keep the last WiFi stats so we can compute a delta. 11054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @GuardedBy("mExternalStatsLock") 11064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private WifiActivityEnergyInfo mLastInfo = new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0); 11074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @GuardedBy("mExternalStatsLock") 11094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private WifiActivityEnergyInfo pullWifiEnergyInfoLocked() { 11104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (mWifiManager == null) { 11114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mWifiManager = IWifiManager.Stub.asInterface( 11124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski ServiceManager.getService(Context.WIFI_SERVICE)); 11134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (mWifiManager == null) { 11144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return null; 11154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski try { 11194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // We read the data even if we are not on battery. This is so that we keep the 11204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // correct delta from when we should start reading (aka when we are on battery). 11214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski WifiActivityEnergyInfo info = mWifiManager.reportActivityInfo(); 11224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (info != null && info.isValid()) { 11234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // We will modify the last info object to be the delta, and store the new 11244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // WifiActivityEnergyInfo object as our last one. 11254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski final WifiActivityEnergyInfo result = mLastInfo; 11264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski result.mTimestamp = info.getTimeStamp(); 11274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski result.mStackState = info.getStackState(); 11284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski result.mControllerTxTimeMs = 1129e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski info.mControllerTxTimeMs - mLastInfo.mControllerTxTimeMs; 11304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski result.mControllerRxTimeMs = 1131e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski info.mControllerRxTimeMs - mLastInfo.mControllerRxTimeMs; 1132e9b9b73ab598a912de04fbd5501bca5924ce8f71Bart Sears result.mControllerEnergyUsed = 1133e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski info.mControllerEnergyUsed - mLastInfo.mControllerEnergyUsed; 1134e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 1135e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // WiFi calculates the idle time as a difference from the on time and the various 1136e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Rx + Tx times. There seems to be some missing time there because this sometimes 1137e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // becomes negative. Just cap it at 0 and move on. 1138e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerIdleTimeMs = 1139e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski Math.max(0, info.mControllerIdleTimeMs - mLastInfo.mControllerIdleTimeMs); 1140e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 1141e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski if (result.mControllerTxTimeMs < 0 || 1142e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerRxTimeMs < 0) { 1143e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // The stats were reset by the WiFi system (which is why our delta is negative). 1144e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Returns the unaltered stats. 1145e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerEnergyUsed = info.mControllerEnergyUsed; 1146e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerRxTimeMs = info.mControllerRxTimeMs; 1147e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerTxTimeMs = info.mControllerTxTimeMs; 1148e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski result.mControllerIdleTimeMs = info.mControllerIdleTimeMs; 1149e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 1150e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + result); 1151e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 11524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mLastInfo = info; 11534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return result; 11544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } catch (RemoteException e) { 11564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // Nothing to report, WiFi is dead. 11574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return null; 11594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @GuardedBy("mExternalStatsLock") 11624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski private BluetoothActivityEnergyInfo pullBluetoothEnergyInfoLocked() { 11634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 11644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (adapter != null) { 11654b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski BluetoothActivityEnergyInfo info = adapter.getControllerActivityEnergyInfo( 11664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski BluetoothAdapter.ACTIVITY_ENERGY_INFO_REFRESHED); 11674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski if (info != null && info.isValid()) { 11684b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return info; 11694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11714b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski return null; 11724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11734b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 11754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates 11764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * batterystats with that information. 11774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * 11784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * We first grab a lock specific to this method, then once all the data has been collected, 11794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * we grab the mStats lock and update the data. 11804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 11814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski void updateExternalStats() { 11824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mExternalStatsLock) { 1183e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski if (mContext == null) { 1184e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // We haven't started yet (which means the BatteryStatsImpl object has 1185e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // no power profile. Don't consume data we can't compute yet. 1186e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski return; 1187e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 1188e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 11894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski final WifiActivityEnergyInfo wifiEnergyInfo = pullWifiEnergyInfoLocked(); 11904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski final BluetoothActivityEnergyInfo bluetoothEnergyInfo = pullBluetoothEnergyInfoLocked(); 11914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 11924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.updateKernelWakelocksLocked(); 11934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime()); 11944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.updateWifiStateLocked(wifiEnergyInfo); 11954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.updateBluetoothStateLocked(bluetoothEnergyInfo); 11964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1200