BatteryStatsService.java revision 8a351373881e2e11c2636d6f9445f9df9accbace
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;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
22e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo;
233abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager;
244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.IWifiManager;
254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo;
2691268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
286f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Looper;
314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Message;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
330068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor;
34cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
38e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
39cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
41e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
42e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
438a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
454b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy;
4632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
47d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
4832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
49e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.server.FgThread;
51cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
5232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
57e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
63cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
64cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        implements PowerManagerInternal.LowPowerModeListener {
65c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
66c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
6706af1fac166a83507450b6bbb1f98a8dde68d92eAdam Lesinski    private boolean mFirstExternalStatsUpdate = true;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IBatteryStats sService;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    final BatteryStatsHandler mHandler;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
72cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    PowerManagerInternal mPowerManagerInternal;
733f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync {
754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_SYNC_EXTERNAL_STATS = 1;
764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_WRITE_TO_DISK = 2;
774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public BatteryStatsHandler(Looper looper) {
794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            super(looper);
804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
834b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public void handleMessage(Message msg) {
844b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            switch (msg.what) {
854b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_SYNC_EXTERNAL_STATS:
86c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                    updateExternalStats((String)msg.obj, false);
874b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_WRITE_TO_DISK:
90c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                    updateExternalStats("write", true);
914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    synchronized (mStats) {
924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                        mStats.writeAsyncLocked();
934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    }
944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
990c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        public void scheduleSync(String reason) {
1004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (!hasMessages(MSG_SYNC_EXTERNAL_STATS)) {
1010c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                Message msg = Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason);
1020c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                sendMessage(msg);
1034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
1044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1070068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    BatteryStatsService(File systemDir, Handler handler) {
1084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Our handler here will be accessing the disk, use a different thread than
1094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // what the ActivityManagerService gave us (no I/O on that one!).
1104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler = new BatteryStatsHandler(FgThread.getHandler().getLooper());
1114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
1134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mStats = new BatteryStatsImpl(systemDir, handler, mHandler);
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void publish(Context context) {
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
11891268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
119e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasani        mStats.setNumSpeedSteps(new PowerProfile(mContext).getNumSpeedSteps());
120f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
121f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                com.android.internal.R.integer.config_radioScanningTimeout)
122f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                * 1000L);
123e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        mStats.setPowerProfile(new PowerProfile(context));
1242c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1252c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
1262c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
1272c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
1282c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
1292c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
1302c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
131cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
132cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal.registerLowPowerModeObserver(this);
1338ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        mStats.notePowerSaveMode(mPowerManagerInternal.getLowPowerModeEnabled());
134c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
1352c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1362c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
13755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
1388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
1394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
140c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski        updateExternalStats("shutdown", true);
14155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
1426b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
14355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
14455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
14555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15091268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
154cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
155cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
156cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void onLowPowerModeChanged(boolean enabled) {
157cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
1588ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePowerSaveMode(enabled);
159cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
160cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
161cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
1714b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
1724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
1734b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
1744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
1754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
1764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK);
1774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1792f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
1802f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
181b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
182b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
183b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
184b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
185b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
186b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
187b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
188b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
189b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
1902f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
1912f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
1922f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
1932f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
1942f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
1952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
1962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
1972f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
1982f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.removeIsolatedUidLocked(isolatedUid, appUid);
1992f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2022f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
2032f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2042f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
2052f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2062f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2072f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2081e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
2091e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2101e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
2111e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2121e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
2141e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
2151e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2161e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
2171e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2181e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2191e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
2202f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessState(String name, int uid, int state) {
2212f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2222f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStateLocked(name, uid, state);
2232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2242f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2252f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessFinish(String name, int uid) {
2272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2282f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
2292f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2302f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2312f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2322f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
2332f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
2378a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
2388a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
240c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski        updateExternalStats("get-stats", true);
2414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
2424b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
2434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
2500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
2510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
2520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
2530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
2540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
255c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski        updateExternalStats("get-stats", true);
2564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
2574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
2584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
2590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
2600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
2610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
2620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
2630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
2640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
2650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
2660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
2670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
2680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2694870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
2704870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
2714870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
2724870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
2734870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
2744870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
275ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
276ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
277ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
278ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
279ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
280ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
281ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
282ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
283ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
284ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
285ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
286ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
287ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
288ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
289099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
290099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
291099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
292099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
293099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
294099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
295099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
296fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
297fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
298fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
299fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
300fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
301fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
302fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
303fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
304fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
305fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
306fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
307fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
308fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
309fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
310fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
311fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
312fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
313fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
314fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
315fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
316fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
317fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobFinish(String name, int uid) {
318fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
319fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
320fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobFinishLocked(name, uid);
321fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
322fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
323fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
3241e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
3251e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3271e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
3281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
3311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
3321e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3331e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3341e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
3351e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3361e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3371e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
338a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
3393d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
342e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
34340c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
347cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
350cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
351cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
355a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
356a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
3577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
3587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
359a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
360a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
3617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
3627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
3637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
364cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
365cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
366e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
367e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
368e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
369cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
370e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
371e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
372e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
373e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
374cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
375cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
3767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
3777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
378cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
3797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
3807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
3817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
3859adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
3929adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
396a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
397a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
398a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
399a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
400a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
401a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
402a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
403a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
404a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
405a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
406a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
407a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
408a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
409a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4136b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4206b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
424e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
427e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
431617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
432617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
433617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
434617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
435617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
436617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
437617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
438e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
441e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
444617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
445e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
446617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
447617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
448e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
449617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
450617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
451e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
4521e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
4531e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
4541e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
4551e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
4561e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
4571e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
4581e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
4592ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn    public void noteMobileRadioPowerState(int powerState, long timestampNs) {
460e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
461e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
4622ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn            mStats.noteMobileRadioPowerState(powerState, timestampNs);
463e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
464e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
465e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
479105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
480e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
481627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
482627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
483e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
484627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
485627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
486627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
487627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
488627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
489627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
490627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
491627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
492627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
49332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
494f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
49532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
496e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
49732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
498e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
49932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
50032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
50132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
50258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
503105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
504105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
50558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
506105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
507105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
508105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
50958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
510105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
511105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
51258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
513105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
514105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
515d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
516244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
517244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
518244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
519244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
520244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
521244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
522244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
523244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
524244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
525244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
526244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
527244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
528244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
529244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
530244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
531244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
532244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
533244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
534244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
535244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
536244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
537244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
538244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
539244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
540244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
541244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
542244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
543244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
54410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
54510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
54610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
54710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
54810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
54910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
55010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
55110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
55210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
55310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
55410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
55510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
55610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
55710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
5586d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
559abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
560abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
5616d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
562abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
563abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
564abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
5656d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
566abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
567abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
5686d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
5696d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
5706d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
5716d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
5726d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
5736d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
5746d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
5756d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
5766d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
5776d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
5786d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
5796d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
5806d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
5816d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
5826d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
5836d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
5846d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
5856d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
5866d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
5876d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
5886d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
5896d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
5906d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
5916d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
5926d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
5936d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
5946d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
5956d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
5966d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
597abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
598abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
599abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
600e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
601e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos) {
602e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
603e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
604e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
605e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
6060c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        mHandler.scheduleSync("wifi-data");
6070c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
6080c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn            mStats.noteWifiRadioPowerState(powerState, tsNanos);
6090c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
610e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
611e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
61258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
613d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
614d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
61558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
616d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
617d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
618d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
61958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
620d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
621d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
62258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
62358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
62458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
62558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
62658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
62758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
62858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
62958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
630d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
631d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
632d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
633ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
634ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
635ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
636ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
637ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
638ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
639ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
6403251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
6413251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
6423251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
6433251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
6443251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
6453251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
6463251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
6473251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
6483251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
6493251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
6503251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
6513251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
6523251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
6533251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
654105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
655105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
657105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
658105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
659105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
660105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
661105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
662105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
663105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
664105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
665105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
666105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
6676ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
6686ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
669105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
670105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
6716ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
672105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
673105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
6746ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
6756ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
676105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
677105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
6786ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
679105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
680105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
6835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
6845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
6855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
6865347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
6875347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
6885347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
6895347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
6905347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
6915347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
6925347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
6935347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
6945347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
6955347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
6967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
6977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
6987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
6997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
7007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
7047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
7077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7106ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
7117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7136ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
7147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7176ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
7187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7206ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
7217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7227e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
724a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
725a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
726a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
727a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
728a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
729a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
730a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
731a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
732a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
733a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
734a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
735a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
736a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
737a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
7387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
7397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
7427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7454b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
7467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
7477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
7507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7537a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
7544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
7551059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
7561059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
7574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
7581059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
7591059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
7601059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
7617a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
7627a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
7637a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
7647a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        synchronized (mStats) {
7657a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey            mStats.noteNetworkStatsEnabledLocked();
7667a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        }
7677a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
7687a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
7698ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
7708ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void noteDeviceIdleMode(boolean enabled, boolean fromActive, boolean fromMotion) {
7718ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
7728ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
7738ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.noteDeviceIdleModeLocked(enabled, fromActive, fromMotion);
7748ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
7758ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
7768ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
7778ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
7788ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
7798ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
7808ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
7818ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
7828ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
7838ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
7848ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
7858ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
7868ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
7878ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
7888ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
7898ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
7908ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7956b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn    public void setBatteryState(int status, int health, int plugType, int level,
7966b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            int temp, int volt) {
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
7984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
7994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
8004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (mStats.isOnBattery() == onBattery) {
8014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // The battery state has not changed, so we don't need to sync external
8024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // stats immediately.
8034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
8044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return;
8054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
8064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
8074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
8084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Sync external stats first as the battery has changed states. If we don't sync
8094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // immediately here, we may not collect the relevant data later.
810c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski        updateExternalStats("battery-state", false);
8114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
8124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
8134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
814633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
815633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
835c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
836c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
837c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        final int[] mIrqs = new int[32];
838c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        final String[] mReasons = new String[32];
839c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
840c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
841c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
842c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
843c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
844c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
845c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
846c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
847c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
848c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                int num;
849c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                while ((num=nativeWaitWakeup(mIrqs, mReasons)) >= 0) {
850c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
851a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                        if (num > 0) {
852a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                            for (int i=0; i<num; i++) {
853a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                                mStats.noteWakeupReasonLocked(mReasons[i]);
854a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                            }
855a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                        } else {
856a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                            mStats.noteWakeupReasonLocked("unknown");
857c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        }
858c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
859c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
860c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
861c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
862c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
863c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
864c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
865c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
866c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    private static native int nativeWaitWakeup(int[] outIrqs, String[] outReasons);
867c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
868ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
86991268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
8701e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
871d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
872ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --checkin: format output for a checkin report.");
873099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
874c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
875c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
876d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
877ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
878ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
879d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
880d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
881cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
882fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
883fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
884fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
885fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
886fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
8870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
8881e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
889fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
890ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
891ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
892cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
893cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
894cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
895cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
896cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
897cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
898cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
8990068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
900cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
9010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
902cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
9039a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
9049a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
9059a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
9069a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
907cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
908cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
909cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
910cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
911cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
912cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
913cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
914cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
9154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
9183abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
9193abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                != PackageManager.PERMISSION_GRANTED) {
9203abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            pw.println("Permission Denial: can't dump BatteryStats from from pid="
9213abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
9223abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + " without permission " + android.Manifest.permission.DUMP);
9233abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            return;
9243abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        }
9253abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
926c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
9270068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
9280068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
9290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
93016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
931c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
932cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
933e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
934c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
935c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
936e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
9370068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
9380068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
939099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
940c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
941c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
942c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
943c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
944c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
945c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
946c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
947c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
948c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
949c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
95016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
95149021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
9520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
953c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
954c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
955c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
956d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
957d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
958e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
959e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
9603d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
961e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
9620ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
964c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                    updateExternalStats("dump", true);
9650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
966c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                    updateExternalStats("dump", true);
9670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
9680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
9690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
9700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
9710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
972d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
973d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
974d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
975d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
976d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
977d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
978d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
979d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
980d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
981d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
982d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
983d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
984fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
985cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
986cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
987cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
988cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
989cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
990cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
991fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
992cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
993cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
994cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
995cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
996cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
997cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
998ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
999ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1000ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1001e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1002a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1003cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
10040ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1005ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1006cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1007cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1008cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1009cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1010cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        reqUid = mContext.getPackageManager().getPackageUid(arg,
1011cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1012cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1013cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1014cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1015cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1016cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1019e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
10200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
10210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
10220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
102313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
102413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
102513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
102613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
102713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
102813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
102913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
1030c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            updateExternalStats("dump", true);
103113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
103213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1033d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
103413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1035ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1036ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1037ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
10381e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1039ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1040ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1041ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1042ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1043ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
10444b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10450068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (useCheckinFormat) {
1046e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0);
10470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
10480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
10490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
10500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
10510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
10520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
10530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
10540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
10550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
10560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
10570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
10580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
10594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                                        null, mStats.mHandler, null);
10600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
10610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
10620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
10630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
10640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
10650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
10660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
10670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        } catch (IOException e) {
10680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
10690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
10700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
10710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
10720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
10730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
1074e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1075c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
107616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
107716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
107816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1079e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1080e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
1081e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1082c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
108316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
108416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
108516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1086e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Objects for extracting data from external sources.
10914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private final Object mExternalStatsLock = new Object();
10924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
10944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private IWifiManager mWifiManager;
10954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // WiFi keeps an accumulated total of stats, unlike Bluetooth.
10974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Keep the last WiFi stats so we can compute a delta.
10984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
10994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo mLastInfo = new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0);
11004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
11024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo pullWifiEnergyInfoLocked() {
11034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (mWifiManager == null) {
11044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mWifiManager = IWifiManager.Stub.asInterface(
11054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    ServiceManager.getService(Context.WIFI_SERVICE));
11064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (mWifiManager == null) {
11074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return null;
11084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
11094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
11104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        try {
11124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // We read the data even if we are not on battery. This is so that we keep the
11134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // correct delta from when we should start reading (aka when we are on battery).
11144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            WifiActivityEnergyInfo info = mWifiManager.reportActivityInfo();
11154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
1116f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                if (info.mControllerEnergyUsed < 0 || info.mControllerIdleTimeMs < 0 ||
1117f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                        info.mControllerRxTimeMs < 0 || info.mControllerTxTimeMs < 0) {
1118f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                    Slog.wtf(TAG, "Reported WiFi energy data is invalid: " + info);
1119f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                    return null;
1120f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                }
1121f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski
11224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // We will modify the last info object to be the delta, and store the new
11234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // WifiActivityEnergyInfo object as our last one.
11244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                final WifiActivityEnergyInfo result = mLastInfo;
11254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mTimestamp = info.getTimeStamp();
11264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mStackState = info.getStackState();
1127f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski
1128f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                // These times seem to be the most reliable.
11294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mControllerTxTimeMs =
1130e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        info.mControllerTxTimeMs - mLastInfo.mControllerTxTimeMs;
11314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mControllerRxTimeMs =
1132e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        info.mControllerRxTimeMs - mLastInfo.mControllerRxTimeMs;
1133e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1134e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // WiFi calculates the idle time as a difference from the on time and the various
1135e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // Rx + Tx times. There seems to be some missing time there because this sometimes
1136e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // becomes negative. Just cap it at 0 and move on.
1137f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                // b/21613534
1138e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                result.mControllerIdleTimeMs =
1139e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        Math.max(0, info.mControllerIdleTimeMs - mLastInfo.mControllerIdleTimeMs);
1140f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                result.mControllerEnergyUsed =
1141f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                        Math.max(0, info.mControllerEnergyUsed - mLastInfo.mControllerEnergyUsed);
1142e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1143e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                if (result.mControllerTxTimeMs < 0 ||
1144e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        result.mControllerRxTimeMs < 0) {
1145e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // The stats were reset by the WiFi system (which is why our delta is negative).
1146e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // Returns the unaltered stats.
1147e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerEnergyUsed = info.mControllerEnergyUsed;
1148e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerRxTimeMs = info.mControllerRxTimeMs;
1149e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerTxTimeMs = info.mControllerTxTimeMs;
1150e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerIdleTimeMs = info.mControllerIdleTimeMs;
1151e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1152e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + result);
1153e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                }
11544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mLastInfo = info;
11554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return result;
11564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
11574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        } catch (RemoteException e) {
11584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // Nothing to report, WiFi is dead.
11594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
11604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
11614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
11624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
11644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private BluetoothActivityEnergyInfo pullBluetoothEnergyInfoLocked() {
11654b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
11664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (adapter != null) {
11674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            BluetoothActivityEnergyInfo info = adapter.getControllerActivityEnergyInfo(
11684b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    BluetoothAdapter.ACTIVITY_ENERGY_INFO_REFRESHED);
11694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
11708a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                if (info.getControllerEnergyUsed() < 0 || info.getControllerIdleTimeMillis() < 0 ||
11718a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                        info.getControllerRxTimeMillis() < 0 || info.getControllerTxTimeMillis() < 0) {
11728a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                    Slog.wtf(TAG, "Bluetooth energy data is invalid: " + info);
11738a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                }
11744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return info;
11754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
11764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
11774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
11784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
11794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
11814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates
11824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * batterystats with that information.
11834b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     *
11844b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * We first grab a lock specific to this method, then once all the data has been collected,
11854b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * we grab the mStats lock and update the data.
1186c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     *
1187c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * TODO(adamlesinski): When we start distributing bluetooth data to apps, we'll want to
1188c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * separate these external stats so that they can be collected individually and on different
1189c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * intervals.
1190c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     *
1191c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * @param reason The reason why this collection was requested. Useful for debugging.
1192c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * @param force If false, some stats may decide not to be collected for efficiency as their
1193c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     *              results aren't needed immediately. When true, collect all stats unconditionally.
11944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
1195c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski    void updateExternalStats(String reason, boolean force) {
11964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mExternalStatsLock) {
1197e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            if (mContext == null) {
1198e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // We haven't started yet (which means the BatteryStatsImpl object has
1199e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // no power profile. Don't consume data we can't compute yet.
1200e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                return;
1201e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            }
1202e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
12034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            final WifiActivityEnergyInfo wifiEnergyInfo = pullWifiEnergyInfoLocked();
1204c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            final BluetoothActivityEnergyInfo bluetoothEnergyInfo;
1205c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            if (force) {
1206c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                // We only pull bluetooth stats when we have to, as we are not distributing its
1207c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                // use amongst apps and the sampling frequency does not matter.
1208c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                bluetoothEnergyInfo = pullBluetoothEnergyInfoLocked();
1209c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            } else {
1210c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                bluetoothEnergyInfo = null;
1211c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            }
1212c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski
12134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            synchronized (mStats) {
12140c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                if (mStats.mRecordAllHistory) {
12150c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                    final long elapsedRealtime = SystemClock.elapsedRealtime();
12160c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                    final long uptime = SystemClock.uptimeMillis();
12170c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                    mStats.addHistoryEventLocked(elapsedRealtime, uptime,
12180c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                            BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, reason, 0);
12190c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                }
122006af1fac166a83507450b6bbb1f98a8dde68d92eAdam Lesinski                mStats.updateCpuTimeLocked(mFirstExternalStatsUpdate);
12214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.updateKernelWakelocksLocked();
12224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime());
12234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.updateWifiStateLocked(wifiEnergyInfo);
12244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mStats.updateBluetoothStateLocked(bluetoothEnergyInfo);
12254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
122606af1fac166a83507450b6bbb1f98a8dde68d92eAdam Lesinski
122706af1fac166a83507450b6bbb1f98a8dde68d92eAdam Lesinski            if (mFirstExternalStatsUpdate) {
122806af1fac166a83507450b6bbb1f98a8dde68d92eAdam Lesinski                // We have read the stats for the first time, which means we have a baseline
122906af1fac166a83507450b6bbb1f98a8dde68d92eAdam Lesinski                // from which to calculate delta.
123006af1fac166a83507450b6bbb1f98a8dde68d92eAdam Lesinski                mFirstExternalStatsUpdate = false;
123106af1fac166a83507450b6bbb1f98a8dde68d92eAdam Lesinski            }
12324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
12334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1235