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 1914fb81af281468735bed1da99931ecc5a0539344Amith Yamasaniimport android.bluetooth.BluetoothHeadset; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 26e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 278a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats; 3032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl; 31e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile; 3232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsService extends IBatteryStats.Stub { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static IBatteryStats sService; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl mStats; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context mContext; 453f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsService(String filename) { 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats = new BatteryStatsImpl(filename); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void publish(Context context) { 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceManager.addService("batteryinfo", asBinder()); 53e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps()); 54f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mStats.setRadioScanningTimeout(mContext.getResources().getInteger( 55f37447bad3773b62176baa837908daf6edb44273Amith Yamasani com.android.internal.R.integer.config_radioScanningTimeout) 56f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * 1000L); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn public void shutdown() { 608a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w("BatteryStats", "Writing battery stats before shutdown..."); 6155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn synchronized (mStats) { 6255280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn mStats.writeLocked(); 6355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 6455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 6555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static IBatteryStats getService() { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder b = ServiceManager.getService("batteryinfo"); 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = asInterface(b); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current statistics object, which may be modified 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to reflect events that affect battery usage. You must lock the 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stats object before doing anything with it. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getActiveStatistics() { 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getStatistics() { 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingPermission( 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i("foo", "SENDING BATTERY INFO:"); 888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.writeToParcel(out, 0); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = out.marshall(); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartWakelock(int uid, String name, int type) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.getUidStatsLocked(uid).noteStartWakeLocked(name, type); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopWakelock(int uid, String name, int type) { 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.getUidStatsLocked(uid).noteStopWakeLocked(name, type); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int uid, int sensor) { 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.getUidStatsLocked(uid).noteStartSensor(sensor); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int uid, int sensor) { 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.getUidStatsLocked(uid).noteStopSensor(sensor); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.noteStartGps(uid); 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.noteStopGps(uid); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOn() { 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.noteScreenOnLocked(); 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 145617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightness(int brightness) { 146617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 147617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 148617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteScreenBrightnessLocked(brightness); 149617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 150617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 151617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOff() { 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.noteScreenOffLocked(); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 159617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteInputEvent() { 160617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 1614cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mStats.noteInputEventAtomic(); 162617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 163617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 164617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivity(int uid, int event) { 165617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 166617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 167617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteUserActivityLocked(uid, event); 168617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 169617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 170617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOn() { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOnLocked(); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOff() { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOffLocked(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 184105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 185e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrength(SignalStrength signalStrength) { 186627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 187627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 188e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mStats.notePhoneSignalStrengthLocked(signalStrength); 189627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 190627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 191627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 192627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionState(int dataType, boolean hasData) { 193627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 194627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 195627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mStats.notePhoneDataConnectionStateLocked(dataType, hasData); 196627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 197627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 19832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 199f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneState(int state) { 20032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani enforceCallingPermission(); 20132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani synchronized (mStats) { 202f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mStats.notePhoneStateLocked(state); 20332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 20432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 20532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 206617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiOn(int uid) { 207105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 208105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 209617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteWifiOnLocked(uid); 210105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 211105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 212105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 213617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteWifiOff(int uid) { 214105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 215105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 216617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteWifiOffLocked(uid); 217105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 218105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 219d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 220244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartAudio(int uid) { 221244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 222244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 223244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOnLocked(uid); 224244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 225244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 226244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 227244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopAudio(int uid) { 228244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 229244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 230244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOffLocked(uid); 231244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 232244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 233244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 234244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartVideo(int uid) { 235244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 236244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 237244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOnLocked(uid); 238244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 239244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 240244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 241244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopVideo(int uid) { 242244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 243244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 244244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOffLocked(uid); 245244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 246244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 247244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 248d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public void noteWifiRunning() { 249d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 250d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 251d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mStats.noteWifiRunningLocked(); 252d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 253d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 254d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 255d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood public void noteWifiStopped() { 256d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 257d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 258d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood mStats.noteWifiStoppedLocked(); 259d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 260d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 261d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOn() { 263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 26414fb81af281468735bed1da99931ecc5a0539344Amith Yamasani BluetoothHeadset headset = new BluetoothHeadset(mContext, null); 265105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 266105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteBluetoothOnLocked(); 26714fb81af281468735bed1da99931ecc5a0539344Amith Yamasani mStats.setBtHeadset(headset); 268105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 269105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 270105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 271105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOff() { 272105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 273105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 274105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteBluetoothOffLocked(); 275105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 276105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 277105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 278105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquired(int uid) { 279105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 280105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 281105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockAcquiredLocked(uid); 282105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 283105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 284105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 285105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleased(int uid) { 286105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 287105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 288105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockReleasedLocked(uid); 289105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 290105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 291105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 292105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockAcquired(int uid) { 293105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 294105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 295105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteScanWifiLockAcquiredLocked(uid); 296105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 297105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 298105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 299105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteScanWifiLockReleased(int uid) { 300105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 301105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 302105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteScanWifiLockReleasedLocked(uid); 303105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 304105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabled(int uid) { 3075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 3085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 3095347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastEnabledLocked(uid); 3105347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 3115347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 3125347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 3135347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabled(int uid) { 3145347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 3155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 3165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastDisabledLocked(uid); 3175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 3185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 3195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.isOnBattery(); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 324105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void setOnBattery(boolean onBattery, int level) { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 326105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.setOnBattery(onBattery, level); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar public void recordCurrentLevel(int level) { 330633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar enforceCallingPermission(); 331633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar mStats.recordCurrentLevel(level); 332633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 333633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimeBattery(); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimePlugged(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission() { 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS, 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingPid(), Binder.getCallingUid(), null); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isCheckin = false; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (args != null) { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (String arg : args) { 3606447ca30b8e41c22c7214f201120327057e356dcDianne Hackborn if ("--checkin".equals(arg)) { 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isCheckin = true; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isCheckin) mStats.dumpCheckinLocked(pw, args); 3671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn else mStats.dumpLocked(pw); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 371