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; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 31cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle; 327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 33e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 34e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager; 358a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats; 3832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl; 39e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile; 4032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 43e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsService extends IBatteryStats.Stub { 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static IBatteryStats sService; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl mStats; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Context mContext; 543f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh private boolean mBluetoothPendingStats; 553f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh private BluetoothHeadset mBluetoothHeadset; 563f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BatteryStatsService(String filename) { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats = new BatteryStatsImpl(filename); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void publish(Context context) { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 6391268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder()); 64e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps()); 65f37447bad3773b62176baa837908daf6edb44273Amith Yamasani mStats.setRadioScanningTimeout(mContext.getResources().getInteger( 66f37447bad3773b62176baa837908daf6edb44273Amith Yamasani com.android.internal.R.integer.config_radioScanningTimeout) 67f37447bad3773b62176baa837908daf6edb44273Amith Yamasani * 1000L); 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn public void shutdown() { 718a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w("BatteryStats", "Writing battery stats before shutdown..."); 7255280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn synchronized (mStats) { 736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.shutdownLocked(); 7455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 7555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 7655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static IBatteryStats getService() { 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8191268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME); 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = asInterface(b); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current statistics object, which may be modified 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to reflect events that affect battery usage. You must lock the 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stats object before doing anything with it. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getActiveStatistics() { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getStatistics() { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingPermission( 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 988a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i("foo", "SENDING BATTERY INFO:"); 998a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.writeToParcel(out, 0); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = out.marshall(); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStartWakelock(int uid, int pid, String name, int type) { 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1109adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStartWakeLocked(uid, pid, name, type); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn public void noteStopWakelock(int uid, int pid, String name, int type) { 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1179adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStopWakeLocked(uid, pid, name, type); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStartWakelockFromSource(WorkSource ws, int pid, String name, int type) { 1227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 1237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 1247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteStartWakeFromSourceLocked(ws, pid, name, type); 1257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 1287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, int type) { 1297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 1307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 1317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteStopWakeFromSourceLocked(ws, pid, name, type); 1327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 1347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int uid, int sensor) { 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1389adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStartSensorLocked(uid, sensor); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int uid, int sensor) { 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1459adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStopSensorLocked(uid, sensor); 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 149a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOn(int uid, long durationMillis) { 150a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 151a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 152a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOnLocked(uid, durationMillis); 153a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 154a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 155a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 156a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOff(int uid) { 157a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 158a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 159a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOffLocked(uid); 160a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 161a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 162a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1666b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStartGpsLocked(uid); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStopGpsLocked(uid); 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOn() { 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.noteScreenOnLocked(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 184617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightness(int brightness) { 185617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 186617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 187617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteScreenBrightnessLocked(brightness); 188617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 189617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 190617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteScreenOff() { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.noteScreenOffLocked(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteInputEvent() { 199617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 2004cee725b1fd3958d850fc83214797f76d5f6b468Christopher Tate mStats.noteInputEventAtomic(); 201617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 202617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 203617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteUserActivity(int uid, int event) { 204617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 205617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 206617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteUserActivityLocked(uid, event); 207617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 208617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 209617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOn() { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOnLocked(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOff() { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOffLocked(); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 223105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 224e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrength(SignalStrength signalStrength) { 225627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 226627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 227e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mStats.notePhoneSignalStrengthLocked(signalStrength); 228627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 229627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 230627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn 231627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionState(int dataType, boolean hasData) { 232627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 233627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 234627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mStats.notePhoneDataConnectionStateLocked(dataType, hasData); 235627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 236627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 23732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 238f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneState(int state) { 23932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani enforceCallingPermission(); 240e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int simState = TelephonyManager.getDefault().getSimState(); 24132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani synchronized (mStats) { 242e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mStats.notePhoneStateLocked(state, simState); 24332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 24432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 24532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 24658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOn() { 247105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 248105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 24958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOnLocked(); 250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 252105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 25358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOff() { 254105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 25658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOffLocked(); 257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 258105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 259d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 260244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartAudio(int uid) { 261244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 262244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 263244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOnLocked(uid); 264244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 265244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 266244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 267244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopAudio(int uid) { 268244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 269244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 270244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOffLocked(uid); 271244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 272244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 273244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 274244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartVideo(int uid) { 275244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 276244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 277244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOnLocked(uid); 278244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 279244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 280244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 281244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopVideo(int uid) { 282244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 283244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 284244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOffLocked(uid); 285244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 286244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 287244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 28858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunning(WorkSource ws) { 289d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 290d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 29158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningLocked(ws); 292d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 293d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 294d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 29558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) { 296d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 297d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 29858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningChangedLocked(oldWs, newWs); 29958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 30058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 30158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 30258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStopped(WorkSource ws) { 30358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn enforceCallingPermission(); 30458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn synchronized (mStats) { 30558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiStoppedLocked(ws); 306d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 307d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 308d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 309105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOn() { 310105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 3113f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 3123f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh if (adapter != null) { 3133f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener, 3143f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh BluetoothProfile.HEADSET); 3153f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 316105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 3173f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh if (mBluetoothHeadset != null) { 3183f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.noteBluetoothOnLocked(); 3193f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.setBtHeadset(mBluetoothHeadset); 3203f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } else { 3213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothPendingStats = true; 3223f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 323105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 324105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3253f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh 3263f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener = 3273f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh new BluetoothProfile.ServiceListener() { 3283f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh public void onServiceConnected(int profile, BluetoothProfile proxy) { 3293f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothHeadset = (BluetoothHeadset) proxy; 3303f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh synchronized (mStats) { 3313f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh if (mBluetoothPendingStats) { 3323f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.noteBluetoothOnLocked(); 3333f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mStats.setBtHeadset(mBluetoothHeadset); 3343f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothPendingStats = false; 3353f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 3363f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 3373f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 3383f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh 3393f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh public void onServiceDisconnected(int profile) { 3403f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothHeadset = null; 3413f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh } 3423f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh }; 3433f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh 344105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteBluetoothOff() { 345105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 346105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 3473f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh mBluetoothPendingStats = false; 348105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteBluetoothOffLocked(); 349105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 350105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 351105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 352105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquired(int uid) { 353105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 354105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 355105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockAcquiredLocked(uid); 356105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 357105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 358105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project 359105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleased(int uid) { 360105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 361105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 362105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockReleasedLocked(uid); 363105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 364105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3656ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 3666ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStarted(int uid) { 367105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 368105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 3696ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedLocked(uid); 370105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 371105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3726ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 3736ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStopped(int uid) { 374105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 375105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 3766ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedLocked(uid); 377105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 378105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabled(int uid) { 3815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 3825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 3835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastEnabledLocked(uid); 3845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 3855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 3865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 3875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabled(int uid) { 3885347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 3895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 3905347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastDisabledLocked(uid); 3915347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 3925347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 3935347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 3947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSource(WorkSource ws) { 3957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 3967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 3977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockAcquiredFromSourceLocked(ws); 3987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 3997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 4017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSource(WorkSource ws) { 4027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 4047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockReleasedFromSourceLocked(ws); 4057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 4086ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedFromSource(WorkSource ws) { 4097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 4116ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedFromSourceLocked(ws); 4127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 4156ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedFromSource(WorkSource ws) { 4167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 4186ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedFromSourceLocked(ws); 4197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 422a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) { 423a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 424a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 425a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph); 426a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 427a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 428a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 429a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) { 430a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 431a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 432a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws); 433a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 434a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 435a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 4367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSource(WorkSource ws) { 4377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 4397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastEnabledFromSourceLocked(ws); 4407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 4437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSource(WorkSource ws) { 4447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 4467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastDisabledFromSourceLocked(ws); 4477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 4507a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 4511059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey public void noteNetworkInterfaceType(String iface, int type) { 4521059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey enforceCallingPermission(); 4531059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (mStats) { 4541059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey mStats.noteNetworkInterfaceTypeLocked(iface, type); 4551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 4561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 4571059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 4587a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 4597a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey public void noteNetworkStatsEnabled() { 4607a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey enforceCallingPermission(); 4617a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey synchronized (mStats) { 4627a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey mStats.noteNetworkStatsEnabledLocked(); 4637a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 4647a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 4657a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.isOnBattery(); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn public void setBatteryState(int status, int health, int plugType, int level, 4716b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn int temp, int volt) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4736b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.setBatteryState(status, health, plugType, level, temp, volt); 474633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 475633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimeBattery(); 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimePlugged(); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission() { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS, 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingPid(), Binder.getCallingUid(), null); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 496ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn private void dumpHelp(PrintWriter pw) { 49791268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn pw.println("Battery stats (batterystats) dump options:"); 49849021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn pw.println(" [--checkin] [-c] [--unplugged] [--reset] [--write] [-h] [<package.name>]"); 499ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --checkin: format output for a checkin report."); 500ec43a6bc17d90058ba2c00e016846c863ab239bcJeff Sharkey pw.println(" --unplugged: only output data since last unplugged."); 501ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --reset: reset the stats, clearing all current data."); 502ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --write: force write current collected stats to disk."); 503ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" -h: print this help text."); 504cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println(" <package.name>: optional name of package to filter output by."); 505ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 506ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 5093abd75ba3a981850cac43a401d0014a836559cb0Kenny Root if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 5103abd75ba3a981850cac43a401d0014a836559cb0Kenny Root != PackageManager.PERMISSION_GRANTED) { 5113abd75ba3a981850cac43a401d0014a836559cb0Kenny Root pw.println("Permission Denial: can't dump BatteryStats from from pid=" 5123abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid() 5133abd75ba3a981850cac43a401d0014a836559cb0Kenny Root + " without permission " + android.Manifest.permission.DUMP); 5143abd75ba3a981850cac43a401d0014a836559cb0Kenny Root return; 5153abd75ba3a981850cac43a401d0014a836559cb0Kenny Root } 5163abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 517e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn boolean isCheckin = false; 51849021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn boolean includeHistory = false; 519ec43a6bc17d90058ba2c00e016846c863ab239bcJeff Sharkey boolean isUnpluggedOnly = false; 5200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean noOutput = false; 521cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn int reqUid = -1; 522e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (args != null) { 523e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn for (String arg : args) { 524e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ("--checkin".equals(arg)) { 525e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn isCheckin = true; 52649021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn } else if ("-c".equals(arg)) { 52749021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn isCheckin = true; 52849021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn includeHistory = true; 529ec43a6bc17d90058ba2c00e016846c863ab239bcJeff Sharkey } else if ("--unplugged".equals(arg)) { 530ec43a6bc17d90058ba2c00e016846c863ab239bcJeff Sharkey isUnpluggedOnly = true; 531e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("--reset".equals(arg)) { 532e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 5336b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.resetAllStatsLocked(); 534e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pw.println("Battery stats reset."); 5350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ("--write".equals(arg)) { 5380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn synchronized (mStats) { 5390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mStats.writeSyncLocked(); 5400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Battery stats written."); 5410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 5420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 543ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } else if ("-h".equals(arg)) { 544ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 545ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn return; 546e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood } else if ("-a".equals(arg)) { 547e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood // fall through 548cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else if (arg.length() > 0 && arg.charAt(0) == '-'){ 5490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Unknown option: " + arg); 550ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 551cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 552cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else { 553cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn // Not an option, last argument must be a package name. 554cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn try { 555cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn reqUid = mContext.getPackageManager().getPackageUid(arg, 556cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn UserHandle.getCallingUserId()); 557cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 558cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println("Unknown package: " + arg); 559cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn dumpHelp(pw); 560cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 561cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 564e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 5650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (noOutput) { 5660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 5670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 568e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (isCheckin) { 569e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0); 570e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 57149021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn mStats.dumpCheckinLocked(pw, apps, isUnpluggedOnly, includeHistory); 572e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 573e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 574e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 575cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn mStats.dumpLocked(pw, isUnpluggedOnly, reqUid); 576e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 580