BatteryStatsService.java revision e9b06d754af03faf27012fbed1e7559ec1ba7c79
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
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.app.IBatteryStats;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.os.BatteryStatsImpl;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
28e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
2955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackbornimport android.util.Log;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic final class BatteryStatsService extends IBatteryStats.Stub {
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IBatteryStats sService;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BatteryStatsService(String filename) {
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStats = new BatteryStatsImpl(filename);
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void publish(Context context) {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ServiceManager.addService("batteryinfo", asBinder());
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
5455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        Log.w("BatteryStats", "Writing battery stats before shutdown...");
5555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
5655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn            mStats.writeLocked();
5755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
5855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
5955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IBinder b = ServiceManager.getService("batteryinfo");
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //Log.i("foo", "SENDING BATTERY INFO:");
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo"));
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStats.writeToParcel(out, 0);
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartWakelock(int uid, String name, int type) {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.getUidStatsLocked(uid).noteStartWakeLocked(name, type);
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopWakelock(int uid, String name, int type) {
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.getUidStatsLocked(uid).noteStopWakeLocked(name, type);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.getUidStatsLocked(uid).noteStartSensor(sensor);
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.getUidStatsLocked(uid).noteStopSensor(sensor);
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.noteStartGps(uid);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.noteStopGps(uid);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOn() {
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.noteScreenOnLocked();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
139617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
140617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
141617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
142617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
143617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
144617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
145617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteScreenOff() {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.noteScreenOffLocked();
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
153617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteInputEvent() {
154617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
155617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
156617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteInputEventLocked();
157617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
158617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
159617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
160617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteUserActivity(int uid, int event) {
161617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
162617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
163617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteUserActivityLocked(uid, event);
164617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
165617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
166617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
180105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
181e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
182627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
183627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
184e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
185627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
186627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
187627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
188627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
189627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
190627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
191627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
192627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
193627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
194627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
195617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOn(int uid) {
196105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
197105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
198617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteWifiOnLocked(uid);
199105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
200105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
201105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
202617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteWifiOff(int uid) {
203105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
204105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
205617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteWifiOffLocked(uid);
206105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
207105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
208d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
209d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiRunning() {
210d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
211d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
212d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mStats.noteWifiRunningLocked();
213d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
214d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
215d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
216d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    public void noteWifiStopped() {
217d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
218d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
219d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood            mStats.noteWifiStoppedLocked();
220d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
221d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
222d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
223105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOn() {
224105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
225105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
226105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteBluetoothOnLocked();
227105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
228105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
229105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
230105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOff() {
231105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
232105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
233105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteBluetoothOffLocked();
234105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
235105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
236105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
237105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
238105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
239105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
240105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
241105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
242105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
243105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
244105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
245105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
246105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
247105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
248105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
249105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
250105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
251105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockAcquired(int uid) {
252105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
253105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
254105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteScanWifiLockAcquiredLocked(uid);
255105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
256105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
257105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
258105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteScanWifiLockReleased(int uid) {
259105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
260105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
261105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteScanWifiLockReleasedLocked(uid);
262105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
263105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2655347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
2665347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
2675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
2685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
2695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
2705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
2715347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
2725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
2735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
2745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
2755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
2765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
2775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
2785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
283105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void setOnBattery(boolean onBattery, int level) {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
285105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        mStats.setOnBattery(onBattery, level);
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
288633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    public void recordCurrentLevel(int level) {
289633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        enforceCallingPermission();
290633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar        mStats.recordCurrentLevel(level);
291633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
292633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            boolean isCheckin = false;
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (args != null) {
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (String arg : args) {
3196447ca30b8e41c22c7214f201120327057e356dcDianne Hackborn                    if ("--checkin".equals(arg)) {
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        isCheckin = true;
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        break;
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (isCheckin) mStats.dumpCheckinLocked(pw, args);
3261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn            else mStats.dumpLocked(pw);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
330