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