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