BatteryStatsService.java revision cbefd8dd2befcb768f911a63becc427ec4c13250
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;
276f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
30cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
33e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
34cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
362ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackbornimport android.telephony.DataConnectionRealTimeInfo;
37e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
38e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
398a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
4232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
43e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
44cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
4532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
48e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
54cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
55cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        implements PowerManagerInternal.LowPowerModeListener {
56c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
57c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IBatteryStats sService;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
623f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh    private boolean mBluetoothPendingStats;
633f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh    private BluetoothHeadset mBluetoothHeadset;
64cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    PowerManagerInternal mPowerManagerInternal;
653f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
666f357d3284a833cc50a990e14b39f389b8972254Jeff Brown    BatteryStatsService(String filename, Handler handler) {
676f357d3284a833cc50a990e14b39f389b8972254Jeff Brown        mStats = new BatteryStatsImpl(filename, handler);
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void publish(Context context) {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
7291268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
73e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps());
74f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
75f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                com.android.internal.R.integer.config_radioScanningTimeout)
76f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                * 1000L);
77cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
78cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal.registerLowPowerModeObserver(this);
79cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mStats.noteLowPowerMode(mPowerManagerInternal.getLowPowerModeEnabled());
80c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
81c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn     }
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
8555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
8755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
8855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
8955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9491268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
98cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
99cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
100cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void onLowPowerModeChanged(boolean enabled) {
101cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
102cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteLowPowerMode(enabled);
103cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
104cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
105cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
1188a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
1198a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mStats.writeToParcel(out, 0);
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
127ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
128ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
129ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
130ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
131ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
132ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
133ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
134ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
135ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
136ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
137ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
138ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
139ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
140ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
141099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void addIsolatedUid(int isolatedUid, int appUid) {
142099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
143099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
144099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
145099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
146099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
147099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
148099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void removeIsolatedUid(int isolatedUid, int appUid) {
149099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
150099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
151099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.removeIsolatedUidLocked(isolatedUid, appUid);
152099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
153099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
154099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
155099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
156099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
157099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
158099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
159099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
160099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
161099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
162a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
1633d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
166e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
16740c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
171cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
174cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
175cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
180a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
1817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
1827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
183a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
184a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
1857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
1867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
1877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
188cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
189cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
190e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
191e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
192e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
193cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
194e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
195e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
196e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
197e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
198cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
199cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
2007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
2017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
202cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
2037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
2047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
2057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
2099adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
2169adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
220a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
221a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
222a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
223a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
224a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
225a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
226a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
227a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
228a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
229a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
230a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
231a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
232a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
233a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
2376b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
2446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
248e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
251e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
255617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
256617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
257617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
258617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
259617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
260617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
261617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
262e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
265e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
268617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
269e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
270617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
271617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
272e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
273617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
274617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
275e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
2762ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn    public void noteMobileRadioPowerState(int powerState, long timestampNs) {
277e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
278e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
2792ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn            mStats.noteMobileRadioPowerState(powerState, timestampNs);
280e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
281e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
282e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
296105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
297e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
298627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
299627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
300e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
301627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
302627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
303627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
304627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
305627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
306627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
307627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
308627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
309627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
31032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
311f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
31232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
313e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
31432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
315e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
31632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
31732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
31832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
31958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
320105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
321105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
32258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
323105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
324105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
325105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
32658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
327105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
328105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
32958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
330105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
331105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
332d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
333244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
334244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
335244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
336244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
337244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
338244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
339244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
340244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
341244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
342244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
343244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
344244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
345244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
346244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
347244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
348244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
349244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
350244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
351244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
352244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
353244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
354244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
355244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
356244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
357244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
358244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
359244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
360244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
36158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
362d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
363d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
36458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
365d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
366d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
367d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
36858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
369d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
370d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
37158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
37258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
37358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
37458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
37558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
37658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
37758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
37858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
379d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
380d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
381d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
382ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
383ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
384ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
385ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
386ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
387ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
388ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
389105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOn() {
390105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
3913f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
3923f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        if (adapter != null) {
3933f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
3943f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                                    BluetoothProfile.HEADSET);
3953f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        }
396105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
3973f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            if (mBluetoothHeadset != null) {
3983f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                mStats.noteBluetoothOnLocked();
3993f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                mStats.setBtHeadset(mBluetoothHeadset);
4003f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            } else {
4013f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                mBluetoothPendingStats = true;
4023f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            }
403105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
404105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
4053f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh
4063f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh    private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener =
4073f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        new BluetoothProfile.ServiceListener() {
4083f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        public void onServiceConnected(int profile, BluetoothProfile proxy) {
4093f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            mBluetoothHeadset = (BluetoothHeadset) proxy;
4103f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            synchronized (mStats) {
4113f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                if (mBluetoothPendingStats) {
4123f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                    mStats.noteBluetoothOnLocked();
4133f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                    mStats.setBtHeadset(mBluetoothHeadset);
4143f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                    mBluetoothPendingStats = false;
4153f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                }
4163f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            }
4173f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        }
4183f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh
4193f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        public void onServiceDisconnected(int profile) {
4203f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            mBluetoothHeadset = null;
4213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        }
4223f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh    };
4233f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh
424105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOff() {
425105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
426105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
4273f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            mBluetoothPendingStats = false;
428105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteBluetoothOffLocked();
429105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
430105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
431105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
432ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteBluetoothState(int bluetoothState) {
433e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
434e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
435ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteBluetoothStateLocked(bluetoothState);
436e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
437e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
438e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
439105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
440105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
441105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
442105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
443105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
444105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
445105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
446105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
447105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
448105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
449105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
450105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
451105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
4526ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
4536ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
454105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
455105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
4566ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
457105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
458105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
4596ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
4606ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
461105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
462105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
4636ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
464105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
465105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4675347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
4685347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
4695347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
4705347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
4715347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
4725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
4735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
4745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
4755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
4765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
4775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
4785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
4795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
4805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
4817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
4827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
4847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
4857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
4887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
4897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
4917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
4927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
4956ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
4967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
4986ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
4997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
5007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
5017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
5026ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
5037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
5047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
5056ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
5067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
5077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
5087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
509a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
510a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
511a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
512a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
513a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
514a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
515a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
516a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
517a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
518a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
519a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
520a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
521a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
522a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
5237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
5247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
5257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
5267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
5277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
5287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
5297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
5307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
5317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
5327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
5337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
5347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
5357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
5367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
5377a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
5381059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    public void noteNetworkInterfaceType(String iface, int type) {
5391059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
5401059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
5411059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey            mStats.noteNetworkInterfaceTypeLocked(iface, type);
5421059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
5431059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
5441059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
5457a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
5467a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
5477a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
5487a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        synchronized (mStats) {
5497a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey            mStats.noteNetworkStatsEnabledLocked();
5507a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        }
5517a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
5527a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void setBatteryState(int status, int health, int plugType, int level,
5586b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int temp, int volt) {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5606b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn        mStats.setBatteryState(status, health, plugType, level, temp, volt);
561633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
562633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
582c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
583c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
584c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        final int[] mIrqs = new int[32];
585c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        final String[] mReasons = new String[32];
586c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
587c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
588c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
589c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
590c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
591c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
592c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
593c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
594c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
595c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                int num;
596c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                while ((num=nativeWaitWakeup(mIrqs, mReasons)) >= 0) {
597c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
598a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                        if (num > 0) {
599a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                            for (int i=0; i<num; i++) {
600a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                                mStats.noteWakeupReasonLocked(mReasons[i]);
601a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                            }
602a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                        } else {
603a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                            mStats.noteWakeupReasonLocked("unknown");
604c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        }
605c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
606c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
607c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
608c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
609c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
610c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
611c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
612c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
613c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    private static native int nativeWaitWakeup(int[] outIrqs, String[] outReasons);
614c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
615ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
61691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
617c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--unplugged] [--charged] [-c]");
618c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  [--reset] [--write] [-h] [<package.name>]");
619ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --checkin: format output for a checkin report.");
620099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
621c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
622ec43a6bc17d90058ba2c00e016846c863ab239bcJeff Sharkey        pw.println("  --unplugged: only output data since last unplugged.");
623c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
624ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
625ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
626cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        pw.println("  --enable: enable an option: full-wake-history.");
627cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        pw.println("  --disable: disable an option: full-wake-history.");
628ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  -h: print this help text.");
629cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
630ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
631ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
632cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
633cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
634cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
635cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
636cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
637cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
638cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
639cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if ("full-wake-history".equals(args[i])) {
640cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
641cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                mStats.setRecordAllWakeLocksLocked(enable);
642cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
643cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
644cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
645cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
646cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
647cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
648cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
649cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
650cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
6533abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
6543abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                != PackageManager.PERMISSION_GRANTED) {
6553abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            pw.println("Permission Denial: can't dump BatteryStats from from pid="
6563abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
6573abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + " without permission " + android.Manifest.permission.DUMP);
6583abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            return;
6593abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        }
6603abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
661c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
662e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        boolean isCheckin = false;
6630ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
664c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
665cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
666e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
667c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
668c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
669e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
670e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    isCheckin = true;
671099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
672c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
673c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
674c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
675c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
676c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
677c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
678c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
679c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
680c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
681c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
68249021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
68349021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                    isCheckin = true;
684c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
685ec43a6bc17d90058ba2c00e016846c863ab239bcJeff Sharkey                } else if ("--unplugged".equals(arg)) {
686c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_UNPLUGGED_ONLY;
687c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
688c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
689e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
690e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
6913d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
692e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
6930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
6960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
6970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
6980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
6990ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
7000ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
701cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                } else if ("--enable".equals(arg)) {
702cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
703cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
704cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
705cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
706cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
707cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
708cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                } else if ("--disable".equals(arg)) {
709cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
710cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
711cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
712cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
713cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
714cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
715ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
716ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
717ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
718e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
719a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
720cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
7210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
722ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
723cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
724cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
725cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
726cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
727cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        reqUid = mContext.getPackageManager().getPackageUid(arg,
728cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
729cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
730cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
731cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
732cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
733cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
736e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
7370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
7380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
7390ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
740e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (isCheckin) {
741e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0);
742e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
743c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
744e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
745e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
746e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
747c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
748e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
752