BatteryStatsService.java revision 1e38382b542f5cef9957a89692b02c55a3dd351c
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
194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo;
203f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothAdapter;
2114fb81af281468735bed1da99931ecc5a0539344Amith Yamasaniimport android.bluetooth.BluetoothHeadset;
223f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothProfile;
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
24e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo;
253abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager;
264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.IWifiManager;
274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo;
2891268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
306f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Looper;
334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Message;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
350068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor;
36cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
40e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
41cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
43e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
44e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
45e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
468a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy;
4932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
50d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
5132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
52e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.server.FgThread;
54cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
5532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
60e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
66cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
67cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        implements PowerManagerInternal.LowPowerModeListener {
68c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
69c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IBatteryStats sService;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    final BatteryStatsHandler mHandler;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
743f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh    private boolean mBluetoothPendingStats;
753f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh    private BluetoothHeadset mBluetoothHeadset;
76cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    PowerManagerInternal mPowerManagerInternal;
773f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync {
794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_SYNC_EXTERNAL_STATS = 1;
804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_WRITE_TO_DISK = 2;
814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public BatteryStatsHandler(Looper looper) {
834b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            super(looper);
844b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
854b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
864b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
874b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public void handleMessage(Message msg) {
884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            switch (msg.what) {
894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_SYNC_EXTERNAL_STATS:
904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    updateExternalStats();
914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_WRITE_TO_DISK:
944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    updateExternalStats();
954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    synchronized (mStats) {
964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                        mStats.writeAsyncLocked();
974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    }
984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
1004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
1034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public void scheduleSync() {
1044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (!hasMessages(MSG_SYNC_EXTERNAL_STATS)) {
1054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                sendEmptyMessage(MSG_SYNC_EXTERNAL_STATS);
1064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
1074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    BatteryStatsService(File systemDir, Handler handler) {
1114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Our handler here will be accessing the disk, use a different thread than
1124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // what the ActivityManagerService gave us (no I/O on that one!).
1134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler = new BatteryStatsHandler(FgThread.getHandler().getLooper());
1144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
1164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mStats = new BatteryStatsImpl(systemDir, handler, mHandler);
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void publish(Context context) {
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
12191268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
122e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps());
123f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
124f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                com.android.internal.R.integer.config_radioScanningTimeout)
125f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                * 1000L);
126e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        mStats.setPowerProfile(new PowerProfile(context));
1272c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1282c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
1292c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
1302c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
1312c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
1322c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
1332c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
134cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
135cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal.registerLowPowerModeObserver(this);
1368ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        mStats.notePowerSaveMode(mPowerManagerInternal.getLowPowerModeEnabled());
137c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
1382c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1392c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
14055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
1418a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
1424b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        updateExternalStats();
14455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
1456b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
14655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
14755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
14855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15391268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
157cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
158cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
159cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void onLowPowerModeChanged(boolean enabled) {
160cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
1618ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePowerSaveMode(enabled);
162cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
163cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
164cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
1744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
1754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
1764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
1774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
1784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
1794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK);
1804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1822f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
1832f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
1842f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
1852f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
1862f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
1872f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
1882f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
1892f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
1902f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
1912f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
1922f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.removeIsolatedUidLocked(isolatedUid, appUid);
1932f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
1942f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
1952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
1962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
1972f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
1982f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
1992f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2021e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
2031e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2041e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
2051e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2061e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2071e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
2081e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
2091e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2101e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
2111e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2121e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
2142f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessState(String name, int uid, int state) {
2152f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2162f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStateLocked(name, uid, state);
2172f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2192f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2202f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessFinish(String name, int uid) {
2212f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2222f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
2232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2242f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2252f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
2272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
2318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
2328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
2344b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        updateExternalStats();
2354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
2364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
2374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2420068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2430068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
2440068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
2450068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
2460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
2470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
2480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
2494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        updateExternalStats();
2504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
2514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
2524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
2530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
2540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
2550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
2560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
2570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
2580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
2590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
2600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
2610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
2620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2634870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
2644870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
2654870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
2664870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
2674870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
2684870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
269ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
270ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
271ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
272ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
273ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
274ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
275ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
276ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
277ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
278ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
279ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
280ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
281ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
282ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
283099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
284099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
285099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
286099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
287099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
288099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
289099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
290fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
291fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
292fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
293fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
294fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
295fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
296fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
297fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
298fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
299fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
300fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
301fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
302fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
303fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
304fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
305fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
306fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
307fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
308fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
309fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
310fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
311fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobFinish(String name, int uid) {
312fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
313fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
314fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobFinishLocked(name, uid);
315fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
316fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
317fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
3181e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
3191e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3201e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3211e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
3221e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3231e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3241e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
3251e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
3261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3271e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
3291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
332a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
3333d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
336e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
33740c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
341cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
344cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
345cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
350a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
3517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
3527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
353a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
354a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
3557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
3567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
3577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
358cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
359cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
360e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
361e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
362e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
363cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
364e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
365e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
366e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
367e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
368cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
369cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
3707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
3717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
372cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
3737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
3747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
3757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
3799adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
3869adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
390a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
391a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
392a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
393a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
394a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
395a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
396a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
397a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
398a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
399a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
400a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
401a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
402a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
403a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4076b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4146b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
418e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
421e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
425617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
426617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
427617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
428617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
429617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
430617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
432e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
435e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
438617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
439e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
440617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
441617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
442e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
443617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
444617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
445e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
4461e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
4471e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
4481e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
4491e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
4501e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
4511e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
4521e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
4532ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn    public void noteMobileRadioPowerState(int powerState, long timestampNs) {
454e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
455e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
4562ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn            mStats.noteMobileRadioPowerState(powerState, timestampNs);
457e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
458e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
459e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
473105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
474e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
475627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
476627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
477e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
478627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
479627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
480627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
481627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
482627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
483627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
484627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
485627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
486627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
48732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
488f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
48932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
490e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
49132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
492e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
49332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
49432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
49532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
49658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
497105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
498105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
49958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
500105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
501105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
502105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
50358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
504105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
505105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
50658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
507105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
508105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
509d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
510244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
511244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
512244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
513244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
514244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
515244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
516244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
517244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
518244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
519244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
520244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
521244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
522244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
523244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
524244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
525244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
526244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
527244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
528244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
529244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
530244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
531244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
532244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
533244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
534244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
535244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
536244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
537244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
53810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
53910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
54010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
54110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
54210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
54310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
54410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
54510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
54610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
54710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
54810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
54910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
55010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
55110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
552abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    public void noteFlashlightOn() {
553abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
554abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
555abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn            mStats.noteFlashlightOnLocked();
556abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
557abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
558abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
559abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    public void noteFlashlightOff() {
560abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
561abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
562abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn            mStats.noteFlashlightOffLocked();
563abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
564abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
565abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
566e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
567e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos) {
568e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
569e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
570e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
571e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
572e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        mHandler.scheduleSync();
573e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
574e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
57558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
576d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
577d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
57858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
579d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
580d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
581d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
58258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
583d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
584d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
58558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
58658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
58758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
58858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
58958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
59058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
59158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
59258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
593d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
594d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
595d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
596ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
597ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
598ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
599ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
600ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
601ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
602ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
6033251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
6043251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
6053251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
6063251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
6073251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
6083251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
6093251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
6103251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
6113251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
6123251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
6133251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
6143251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
6153251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
6163251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
617105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOn() {
618105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
6193f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
6203f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        if (adapter != null) {
6213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
6223f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                                    BluetoothProfile.HEADSET);
6233f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        }
624105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
6253f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            if (mBluetoothHeadset != null) {
6263f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                mStats.noteBluetoothOnLocked();
6273f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                mStats.setBtHeadset(mBluetoothHeadset);
6283f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            } else {
6293f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                mBluetoothPendingStats = true;
6303f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            }
631105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
632105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
6333f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh
6343f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh    private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener =
6353f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        new BluetoothProfile.ServiceListener() {
6363f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        public void onServiceConnected(int profile, BluetoothProfile proxy) {
6373f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            mBluetoothHeadset = (BluetoothHeadset) proxy;
6383f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            synchronized (mStats) {
6393f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                if (mBluetoothPendingStats) {
6403f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                    mStats.noteBluetoothOnLocked();
6413f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                    mStats.setBtHeadset(mBluetoothHeadset);
6423f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                    mBluetoothPendingStats = false;
6433f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh                }
6443f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            }
6453f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        }
6463f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh
6473f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        public void onServiceDisconnected(int profile) {
6483f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            mBluetoothHeadset = null;
6493f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh        }
6503f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh    };
6513f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh
652105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteBluetoothOff() {
653105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
654105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
6553f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganesh            mBluetoothPendingStats = false;
656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteBluetoothOffLocked();
657105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
658105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
659105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
660ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteBluetoothState(int bluetoothState) {
661e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
662e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
663ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteBluetoothStateLocked(bluetoothState);
664e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
665e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
666e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
667105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
668105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
669105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
670105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
671105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
672105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
673105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
674105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
675105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
677105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
678105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
679105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
6806ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
6816ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
682105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
683105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
6846ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
685105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
686105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
6876ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
6886ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
689105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
690105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
6916ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
692105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
693105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
6965347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
6975347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
6985347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
6995347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7005347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7015347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7025347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
7035347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
7045347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
7055347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
7065347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7075347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7085347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
7107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
7137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
7177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
7207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7236ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
7247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7266ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
7277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7306ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
7317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7336ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
7347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
737a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
738a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
739a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
740a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
741a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
742a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
743a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
744a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
745a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
746a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
747a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
748a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
749a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
750a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
7517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
7527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
7557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
7597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
7607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
7637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7667a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
7674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
7681059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
7691059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
7704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
7711059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
7721059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
7731059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
7747a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
7757a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
7767a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
7777a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        synchronized (mStats) {
7787a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey            mStats.noteNetworkStatsEnabledLocked();
7797a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        }
7807a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
7817a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
7828ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
7838ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void noteDeviceIdleMode(boolean enabled, boolean fromActive, boolean fromMotion) {
7848ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
7858ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
7868ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.noteDeviceIdleModeLocked(enabled, fromActive, fromMotion);
7878ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
7888ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
7898ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
7908ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
7918ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
7928ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
7938ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
7948ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
7958ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
7968ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
7978ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
7988ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
7998ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
8008ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
8018ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8028ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8038ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8086b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void setBatteryState(int status, int health, int plugType, int level,
8096b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int temp, int volt) {
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
8114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
8124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
8134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (mStats.isOnBattery() == onBattery) {
8144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // The battery state has not changed, so we don't need to sync external
8154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // stats immediately.
8164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
8174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return;
8184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
8194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
8204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
8214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Sync external stats first as the battery has changed states. If we don't sync
8224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // immediately here, we may not collect the relevant data later.
8234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        updateExternalStats();
8244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
8254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
8264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
827633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
828633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
848c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
849c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
850c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        final int[] mIrqs = new int[32];
851c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        final String[] mReasons = new String[32];
852c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
853c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
854c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
855c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
856c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
857c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
858c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
859c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
860c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
861c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                int num;
862c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                while ((num=nativeWaitWakeup(mIrqs, mReasons)) >= 0) {
863c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
864a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                        if (num > 0) {
865a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                            for (int i=0; i<num; i++) {
866a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                                mStats.noteWakeupReasonLocked(mReasons[i]);
867a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                            }
868a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                        } else {
869a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                            mStats.noteWakeupReasonLocked("unknown");
870c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        }
871c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
872c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
873c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
874c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
875c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
876c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
877c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
878c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
879c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    private static native int nativeWaitWakeup(int[] outIrqs, String[] outReasons);
880c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
881ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
88291268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
8831e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
884d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
885ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --checkin: format output for a checkin report.");
886099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
887c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
888c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
889d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
890ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
891ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
892d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
893d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
894cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
895fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
896fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
897fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
898fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
899fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
9000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
9011e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
902fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
903ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
904ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
905cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
906cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
907cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
908cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
909cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
910cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
911cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
9120068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
913cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
9140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
915cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
9169a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
9179a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
9189a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
9199a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
920cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
921cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
922cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
923cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
924cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
925cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
926cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
927cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
9284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
9313abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
9323abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                != PackageManager.PERMISSION_GRANTED) {
9333abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            pw.println("Permission Denial: can't dump BatteryStats from from pid="
9343abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
9353abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + " without permission " + android.Manifest.permission.DUMP);
9363abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            return;
9373abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        }
9383abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
939c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
9400068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
9410068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
9420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
94316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
944c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
945cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
946e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
947c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
948c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
949e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
9500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
9510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
952099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
953c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
954c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
955c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
956c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
957c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
958c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
959c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
960c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
961c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
962c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
96316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
96449021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
9650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
966c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
967c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
968c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
969d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
970d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
971e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
972e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
9733d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
974e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
9750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
9774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    updateExternalStats();
9780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
9794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    updateExternalStats();
9800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
9810ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
9820ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
9830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
9840ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
985d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
986d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
987d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
988d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
989d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
990d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
991d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
992d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
993d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
994d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
995d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
996d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
997fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
998cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
999cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1000cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1001cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1002cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1003cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1004fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1005cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1006cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1007cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1008cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1009cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1010cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1011ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1012ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1013ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1014e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1015a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1016cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
10170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1018ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1019cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1020cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1021cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1022cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1023cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        reqUid = mContext.getPackageManager().getPackageUid(arg,
1024cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1025cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1026cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1027cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1028cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1029cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1032e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
10330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
10340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
10350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
1036d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        if (BatteryStatsHelper.checkWifiOnly(mContext)) {
1037d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn            flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
1038d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
1039ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1040ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1041ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
10421e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1043ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1044ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1045ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1046ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1047ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
10484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Fetch data from external sources and update the BatteryStatsImpl object with them.
10504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        updateExternalStats();
10514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (useCheckinFormat) {
1053e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0);
10540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
10550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
10560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
10570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
10580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
10590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
10600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
10610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
10620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
10630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
10640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
10650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
10664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                                        null, mStats.mHandler, null);
10670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
10680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
10690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
10700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
10710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
10720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
10730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
10740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        } catch (IOException e) {
10750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
10760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
10770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
10780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
10790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
10800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
1081e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1082c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
108316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
108416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
108516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1086e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1087e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
1088e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1089c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
109016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
109116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
109216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1093e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Objects for extracting data from external sources.
10984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private final Object mExternalStatsLock = new Object();
10994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
11014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private IWifiManager mWifiManager;
11024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // WiFi keeps an accumulated total of stats, unlike Bluetooth.
11044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Keep the last WiFi stats so we can compute a delta.
11054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
11064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo mLastInfo = new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0);
11074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
11094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo pullWifiEnergyInfoLocked() {
11104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (mWifiManager == null) {
11114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mWifiManager = IWifiManager.Stub.asInterface(
11124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    ServiceManager.getService(Context.WIFI_SERVICE));
11134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (mWifiManager == null) {
11144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return null;
11154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
11164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
11174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        try {
11194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // We read the data even if we are not on battery. This is so that we keep the
11204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // correct delta from when we should start reading (aka when we are on battery).
11214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            WifiActivityEnergyInfo info = mWifiManager.reportActivityInfo();
11224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
11234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // We will modify the last info object to be the delta, and store the new
11244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // WifiActivityEnergyInfo object as our last one.
11254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                final WifiActivityEnergyInfo result = mLastInfo;
11264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mTimestamp = info.getTimeStamp();
11274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mStackState = info.getStackState();
11284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mControllerTxTimeMs =
1129e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        info.mControllerTxTimeMs - mLastInfo.mControllerTxTimeMs;
11304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mControllerRxTimeMs =
1131e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        info.mControllerRxTimeMs - mLastInfo.mControllerRxTimeMs;
1132e9b9b73ab598a912de04fbd5501bca5924ce8f71Bart Sears                result.mControllerEnergyUsed =
1133e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        info.mControllerEnergyUsed - mLastInfo.mControllerEnergyUsed;
1134e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1135e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // WiFi calculates the idle time as a difference from the on time and the various
1136e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // Rx + Tx times. There seems to be some missing time there because this sometimes
1137e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // becomes negative. Just cap it at 0 and move on.
1138e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                result.mControllerIdleTimeMs =
1139e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        Math.max(0, info.mControllerIdleTimeMs - mLastInfo.mControllerIdleTimeMs);
1140e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1141e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                if (result.mControllerTxTimeMs < 0 ||
1142e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        result.mControllerRxTimeMs < 0) {
1143e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // The stats were reset by the WiFi system (which is why our delta is negative).
1144e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // Returns the unaltered stats.
1145e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerEnergyUsed = info.mControllerEnergyUsed;
1146e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerRxTimeMs = info.mControllerRxTimeMs;
1147e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerTxTimeMs = info.mControllerTxTimeMs;
1148e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerIdleTimeMs = info.mControllerIdleTimeMs;
1149e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1150e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + result);
1151e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                }
11524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mLastInfo = info;
11534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return result;
11544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
11554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        } catch (RemoteException e) {
11564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // Nothing to report, WiFi is dead.
11574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
11584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
11594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
11604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
11624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private BluetoothActivityEnergyInfo pullBluetoothEnergyInfoLocked() {
11634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
11644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (adapter != null) {
11654b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            BluetoothActivityEnergyInfo info = adapter.getControllerActivityEnergyInfo(
11664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    BluetoothAdapter.ACTIVITY_ENERGY_INFO_REFRESHED);
11674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
11684b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return info;
11694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
11704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
11714b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
11724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
11734b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
11754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates
11764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * batterystats with that information.
11774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     *
11784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * We first grab a lock specific to this method, then once all the data has been collected,
11794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * we grab the mStats lock and update the data.
11804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
11814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    void updateExternalStats() {
11824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mExternalStatsLock) {
1183e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            if (mContext == null) {
1184e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // We haven't started yet (which means the BatteryStatsImpl object has
1185e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // no power profile. Don't consume data we can't compute yet.
1186e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                return;
1187e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            }
1188e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
11894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            final WifiActivityEnergyInfo wifiEnergyInfo = pullWifiEnergyInfoLocked();
11904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            final BluetoothActivityEnergyInfo bluetoothEnergyInfo = pullBluetoothEnergyInfoLocked();
11914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            synchronized (mStats) {
11924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.updateKernelWakelocksLocked();
11934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime());
11944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.updateWifiStateLocked(wifiEnergyInfo);
11954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.updateBluetoothStateLocked(bluetoothEnergyInfo);
11964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
11974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
11984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1200