BatteryStatsService.java revision cbefd8dd2befcb768f911a63becc427ec4c13250
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 193f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothAdapter; 2014fb81af281468735bed1da99931ecc5a0539344Amith Yamasaniimport android.bluetooth.BluetoothHeadset; 213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothProfile; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 23e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo; 243abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager; 2591268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 276f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 30cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 33e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock; 34cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle; 357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 362ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackbornimport android.telephony.DataConnectionRealTimeInfo; 37e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 38e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager; 398a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats; 4232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl; 43e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile; 44cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices; 4532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 48e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 54cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub 55cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn implements PowerManagerInternal.LowPowerModeListener { 56c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn static final String TAG = "BatteryStatsService"; 57c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static IBatteryStats sService; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl mStats; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context mContext; 623f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh private boolean mBluetoothPendingStats; 633f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh private BluetoothHeadset mBluetoothHeadset; 64cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn PowerManagerInternal mPowerManagerInternal; 653f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 666f357d3284a833cc50a990e14b39f389b8972254Jeff Brown BatteryStatsService(String filename, Handler handler) { 676f357d3284a833cc50a990e14b39f389b8972254Jeff Brown mStats = new BatteryStatsImpl(filename, handler); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void publish(Context context) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 7291268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder()); 73e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps()); 74f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mStats.setRadioScanningTimeout(mContext.getResources().getInteger( 75f37447bad3773b62176baa837908daf6edb44273Amith Yamasani com.android.internal.R.integer.config_radioScanningTimeout) 76f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * 1000L); 77cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class); 78cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mPowerManagerInternal.registerLowPowerModeObserver(this); 79cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteLowPowerMode(mPowerManagerInternal.getLowPowerModeEnabled()); 80c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn (new WakeupReasonThread()).start(); 81c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn public void shutdown() { 848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w("BatteryStats", "Writing battery stats before shutdown..."); 8555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn synchronized (mStats) { 866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.shutdownLocked(); 8755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 8855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 8955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static IBatteryStats getService() { 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9491268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME); 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = asInterface(b); 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 98cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 99cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn @Override 100cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void onLowPowerModeChanged(boolean enabled) { 101cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 102cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteLowPowerMode(enabled); 103cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 104cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 105cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current statistics object, which may be modified 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to reflect events that affect battery usage. You must lock the 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stats object before doing anything with it. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getActiveStatistics() { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getStatistics() { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingPermission( 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 1188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i("foo", "SENDING BATTERY INFO:"); 1198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.writeToParcel(out, 0); 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = out.marshall(); 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 127ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeBatteryTimeRemaining() { 128ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 129ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime()); 130ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 131ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 132ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 133ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 134ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeChargeTimeRemaining() { 135ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 136ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime()); 137ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 138ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 139ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 140ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 141099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn public void addIsolatedUid(int isolatedUid, int appUid) { 142099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn enforceCallingPermission(); 143099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn synchronized (mStats) { 144099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn mStats.addIsolatedUidLocked(isolatedUid, appUid); 145099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 146099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 147099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 148099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn public void removeIsolatedUid(int isolatedUid, int appUid) { 149099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn enforceCallingPermission(); 150099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn synchronized (mStats) { 151099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn mStats.removeIsolatedUidLocked(isolatedUid, appUid); 152099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 153099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 154099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 155099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn public void noteEvent(int code, String name, int uid) { 156099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn enforceCallingPermission(); 157099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn synchronized (mStats) { 158099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn mStats.noteEventLocked(code, name, uid); 159099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 160099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 161099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 162a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelock(int uid, int pid, String name, String historyName, int type, 1633d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn boolean unimportantForLogging) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 166e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging, 16740c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 171cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 174cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeLocked(uid, pid, name, historyName, type, 175cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelockFromSource(WorkSource ws, int pid, String name, 180a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn String historyName, int type, boolean unimportantForLogging) { 1817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 1827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 183a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName, 184a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn type, unimportantForLogging); 1857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 188cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name, 189cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn String historyName, int type, WorkSource newWs, int newPid, String newName, 190e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn String newHistoryName, int newType, boolean newUnimportantForLogging) { 191e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn enforceCallingPermission(); 192e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn synchronized (mStats) { 193cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type, 194e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging); 195e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 196e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 197e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 198cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName, 199cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn int type) { 2007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 2017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 202cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type); 2037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 2057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int uid, int sensor) { 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 2099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStartSensorLocked(uid, sensor); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int uid, int sensor) { 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 2169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStopSensorLocked(uid, sensor); 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 220a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOn(int uid, long durationMillis) { 221a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 222a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 223a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOnLocked(uid, durationMillis); 224a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 225a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 226a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 227a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOff(int uid) { 228a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 229a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 230a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOffLocked(uid); 231a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 232a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 233a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 2376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStartGpsLocked(uid); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 2446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStopGpsLocked(uid); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 248e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteScreenState(int state) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 251e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteScreenStateLocked(state); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightness(int brightness) { 256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteScreenBrightnessLocked(brightness); 259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 262e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteUserActivity(int uid, int event) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 265e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteUserActivityLocked(uid, event); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 268617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 269e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteInteractive(boolean interactive) { 270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 272e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteInteractiveLocked(interactive); 273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 275e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 2762ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn public void noteMobileRadioPowerState(int powerState, long timestampNs) { 277e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn enforceCallingPermission(); 278e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn synchronized (mStats) { 2792ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn mStats.noteMobileRadioPowerState(powerState, timestampNs); 280e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 281e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 282e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOn() { 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOnLocked(); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOff() { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOffLocked(); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 296105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 297e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrength(SignalStrength signalStrength) { 298627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 299627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 300e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mStats.notePhoneSignalStrengthLocked(signalStrength); 301627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 302627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 303627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 304627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionState(int dataType, boolean hasData) { 305627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mStats.notePhoneDataConnectionStateLocked(dataType, hasData); 308627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 309627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 31032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 311f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneState(int state) { 31232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani enforceCallingPermission(); 313e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int simState = TelephonyManager.getDefault().getSimState(); 31432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani synchronized (mStats) { 315e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mStats.notePhoneStateLocked(state, simState); 31632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 31732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 31832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 31958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOn() { 320105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 321105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 32258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOnLocked(); 323105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 324105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 325105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 32658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOff() { 327105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 328105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 32958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOffLocked(); 330105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 331105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 332d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 333244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartAudio(int uid) { 334244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 335244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 336244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOnLocked(uid); 337244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 338244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 339244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 340244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopAudio(int uid) { 341244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 342244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 343244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOffLocked(uid); 344244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 345244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 346244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 347244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartVideo(int uid) { 348244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 349244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 350244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOnLocked(uid); 351244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 352244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 353244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 354244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopVideo(int uid) { 355244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 356244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 357244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOffLocked(uid); 358244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 359244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 360244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 36158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunning(WorkSource ws) { 362d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 363d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 36458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningLocked(ws); 365d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 366d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 367d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 36858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) { 369d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 370d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 37158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningChangedLocked(oldWs, newWs); 37258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 37358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 37458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 37558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStopped(WorkSource ws) { 37658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn enforceCallingPermission(); 37758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn synchronized (mStats) { 37858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiStoppedLocked(ws); 379d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 380d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 381d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 382ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn public void noteWifiState(int wifiState, String accessPoint) { 383ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn enforceCallingPermission(); 384ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn synchronized (mStats) { 385ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn mStats.noteWifiStateLocked(wifiState, accessPoint); 386ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 387ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 388ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn 389105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOn() { 390105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 3913f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 3923f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh if (adapter != null) { 3933f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener, 3943f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh BluetoothProfile.HEADSET); 3953f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 396105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 3973f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh if (mBluetoothHeadset != null) { 3983f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.noteBluetoothOnLocked(); 3993f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.setBtHeadset(mBluetoothHeadset); 4003f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } else { 4013f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothPendingStats = true; 4023f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 403105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 404105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4053f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh 4063f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener = 4073f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh new BluetoothProfile.ServiceListener() { 4083f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh public void onServiceConnected(int profile, BluetoothProfile proxy) { 4093f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothHeadset = (BluetoothHeadset) proxy; 4103f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh synchronized (mStats) { 4113f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh if (mBluetoothPendingStats) { 4123f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.noteBluetoothOnLocked(); 4133f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.setBtHeadset(mBluetoothHeadset); 4143f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothPendingStats = false; 4153f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 4163f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 4173f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 4183f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh 4193f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh public void onServiceDisconnected(int profile) { 4203f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothHeadset = null; 4213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 4223f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh }; 4233f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh 424105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOff() { 425105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 426105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 4273f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothPendingStats = false; 428105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteBluetoothOffLocked(); 429105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 430105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 431105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 432ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn public void noteBluetoothState(int bluetoothState) { 433e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn enforceCallingPermission(); 434e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn synchronized (mStats) { 435ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn mStats.noteBluetoothStateLocked(bluetoothState); 436e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 437e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 438e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 439105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquired(int uid) { 440105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 441105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 442105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockAcquiredLocked(uid); 443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 444105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 445105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 446105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleased(int uid) { 447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 448105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 449105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockReleasedLocked(uid); 450105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 451105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4526ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 4536ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStarted(int uid) { 454105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 455105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 4566ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedLocked(uid); 457105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 458105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4596ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 4606ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStopped(int uid) { 461105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 462105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 4636ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedLocked(uid); 464105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 465105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabled(int uid) { 4685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 4695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 4705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastEnabledLocked(uid); 4715347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 4725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 4735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 4745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabled(int uid) { 4755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 4765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 4775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastDisabledLocked(uid); 4785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 4795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 4805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 4817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSource(WorkSource ws) { 4827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 4847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockAcquiredFromSourceLocked(ws); 4857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 4887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSource(WorkSource ws) { 4897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 4917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockReleasedFromSourceLocked(ws); 4927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 4956ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedFromSource(WorkSource ws) { 4967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 4986ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedFromSourceLocked(ws); 4997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 5026ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedFromSource(WorkSource ws) { 5037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 5047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 5056ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedFromSourceLocked(ws); 5067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 509a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) { 510a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 511a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 512a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph); 513a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 514a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 515a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 516a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) { 517a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 518a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 519a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws); 520a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 521a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 522a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 5237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSource(WorkSource ws) { 5247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 5257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 5267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastEnabledFromSourceLocked(ws); 5277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 5307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSource(WorkSource ws) { 5317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 5327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 5337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastDisabledFromSourceLocked(ws); 5347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 5377a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 5381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public void noteNetworkInterfaceType(String iface, int type) { 5391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey enforceCallingPermission(); 5401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (mStats) { 5411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey mStats.noteNetworkInterfaceTypeLocked(iface, type); 5421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 5431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 5441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 5457a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 5467a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey public void noteNetworkStatsEnabled() { 5477a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey enforceCallingPermission(); 5487a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey synchronized (mStats) { 5497a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey mStats.noteNetworkStatsEnabledLocked(); 5507a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 5517a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 5527a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.isOnBattery(); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void setBatteryState(int status, int health, int plugType, int level, 5586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int temp, int volt) { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.setBatteryState(status, health, plugType, level, temp, volt); 561633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 562633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimeBattery(); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimePlugged(); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission() { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS, 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingPid(), Binder.getCallingUid(), null); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 582c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 583c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final class WakeupReasonThread extends Thread { 584c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final int[] mIrqs = new int[32]; 585c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final String[] mReasons = new String[32]; 586c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 587c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn WakeupReasonThread() { 588c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn super("BatteryStats_wakeupReason"); 589c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 590c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 591c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn public void run() { 592c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND); 593c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 594c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn try { 595c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn int num; 596c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn while ((num=nativeWaitWakeup(mIrqs, mReasons)) >= 0) { 597c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn synchronized (mStats) { 598a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn if (num > 0) { 599a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn for (int i=0; i<num; i++) { 600a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn mStats.noteWakeupReasonLocked(mReasons[i]); 601a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn } 602a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn } else { 603a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn mStats.noteWakeupReasonLocked("unknown"); 604c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 605c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 606c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 607c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } catch (RuntimeException e) { 608c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Slog.e(TAG, "Failure reading wakeup reasons", e); 609c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 610c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 611c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 612c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 613c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn private static native int nativeWaitWakeup(int[] outIrqs, String[] outReasons); 614c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 615ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn private void dumpHelp(PrintWriter pw) { 61691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn pw.println("Battery stats (batterystats) dump options:"); 617c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" [--checkin] [--history] [--history-start] [--unplugged] [--charged] [-c]"); 618c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" [--reset] [--write] [-h] [<package.name>]"); 619ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --checkin: format output for a checkin report."); 620099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn pw.println(" --history: show only history data."); 621c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --history-start <num>: show only history data starting at given time offset."); 622ec43a6bc17d90058ba2c00e016846c863ab239bcJeff Sharkey pw.println(" --unplugged: only output data since last unplugged."); 623c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --charged: only output data since last charged."); 624ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --reset: reset the stats, clearing all current data."); 625ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --write: force write current collected stats to disk."); 626cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println(" --enable: enable an option: full-wake-history."); 627cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println(" --disable: disable an option: full-wake-history."); 628ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" -h: print this help text."); 629cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println(" <package.name>: optional name of package to filter output by."); 630ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 631ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 632cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) { 633cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i++; 634cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i >= args.length) { 635cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Missing option argument for " + (enable ? "--enable" : "--disable")); 636cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 637cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 638cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 639cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if ("full-wake-history".equals(args[i])) { 640cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 641cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.setRecordAllWakeLocksLocked(enable); 642cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 643cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else { 644cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Unknown enable/disable option: " + args[i]); 645cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 646cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 647cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 648cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return i; 649cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 650cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 6533abd75ba3a981850cac43a401d0014a836559cb0Kenny Root if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 6543abd75ba3a981850cac43a401d0014a836559cb0Kenny Root != PackageManager.PERMISSION_GRANTED) { 6553abd75ba3a981850cac43a401d0014a836559cb0Kenny Root pw.println("Permission Denial: can't dump BatteryStats from from pid=" 6563abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() 6573abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + " without permission " + android.Manifest.permission.DUMP); 6583abd75ba3a981850cac43a401d0014a836559cb0Kenny Root return; 6593abd75ba3a981850cac43a401d0014a836559cb0Kenny Root } 6603abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 661c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn int flags = 0; 662e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean isCheckin = false; 6630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean noOutput = false; 664c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn long historyStart = -1; 665cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn int reqUid = -1; 666e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (args != null) { 667c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn for (int i=0; i<args.length; i++) { 668c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn String arg = args[i]; 669e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ("--checkin".equals(arg)) { 670e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn isCheckin = true; 671099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } else if ("--history".equals(arg)) { 672c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 673c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--history-start".equals(arg)) { 674c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 675c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn i++; 676c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (i >= args.length) { 677c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println("Missing time argument for --history-since"); 678c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn dumpHelp(pw); 679c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn return; 680c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 681c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn historyStart = Long.parseLong(args[i]); 68249021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn } else if ("-c".equals(arg)) { 68349021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn isCheckin = true; 684c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_INCLUDE_HISTORY; 685ec43a6bc17d90058ba2c00e016846c863ab239bcJeff Sharkey } else if ("--unplugged".equals(arg)) { 686c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_UNPLUGGED_ONLY; 687c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--charged".equals(arg)) { 688c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 689e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("--reset".equals(arg)) { 690e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 6913d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn mStats.resetAllStatsCmdLocked(); 692e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pw.println("Battery stats reset."); 6930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ("--write".equals(arg)) { 6960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn synchronized (mStats) { 6970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mStats.writeSyncLocked(); 6980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Battery stats written."); 6990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 7000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 701cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else if ("--enable".equals(arg)) { 702cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, true); 703cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 704cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 705cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 706cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Enabled: " + args[i]); 707cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 708cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else if ("--disable".equals(arg)) { 709cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, false); 710cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 711cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 712cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 713cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Disabled: " + args[i]); 714cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 715ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } else if ("-h".equals(arg)) { 716ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 717ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn return; 718e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood } else if ("-a".equals(arg)) { 719a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn flags |= BatteryStats.DUMP_VERBOSE; 720cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else if (arg.length() > 0 && arg.charAt(0) == '-'){ 7210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Unknown option: " + arg); 722ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 723cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 724cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else { 725cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn // Not an option, last argument must be a package name. 726cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn try { 727cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn reqUid = mContext.getPackageManager().getPackageUid(arg, 728cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn UserHandle.getCallingUserId()); 729cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 730cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println("Unknown package: " + arg); 731cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn dumpHelp(pw); 732cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 733cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 736e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 7370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (noOutput) { 7380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 7390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 740e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (isCheckin) { 741e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0); 742e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 743c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart); 744e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 745e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 746e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 747c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart); 748e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 752