BatteryStatsService.java revision 9f55cc71b9b0a27604d448b5c54e3c377b7a067f
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;
349ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException;
35cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
39e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
40cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
4206f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
4321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo;
44e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
45e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
4661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskiimport android.util.IntArray;
478a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
49bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinskiimport android.util.TimeUtils;
504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy;
5132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
52d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
5332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
54e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
5521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport com.android.internal.telephony.ITelephony;
564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.server.FgThread;
57cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
5832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
63515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
64515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
65515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
66515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
67515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
68e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
74cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
75cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        implements PowerManagerInternal.LowPowerModeListener {
76c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
77c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IBatteryStats sService;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    final BatteryStatsHandler mHandler;
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
82cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    PowerManagerInternal mPowerManagerInternal;
833f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
844b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync {
854b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_SYNC_EXTERNAL_STATS = 1;
864b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_WRITE_TO_DISK = 2;
87a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        private int mUpdateFlags = 0;
8861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private IntArray mUidsToRemove = new IntArray();
894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public BatteryStatsHandler(Looper looper) {
914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            super(looper);
924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public void handleMessage(Message msg) {
964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            switch (msg.what) {
974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_SYNC_EXTERNAL_STATS:
98a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    final int updateFlags;
99a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    synchronized (this) {
100a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        removeMessages(MSG_SYNC_EXTERNAL_STATS);
101a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        updateFlags = mUpdateFlags;
102a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        mUpdateFlags = 0;
103a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    }
104a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    updateExternalStats((String)msg.obj, updateFlags);
10556d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski
10656d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // other parts of the system could be calling into us
10756d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // from mStats in order to report of changes. We must grab the mStats
10856d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // lock before grabbing our own or we'll end up in a deadlock.
10956d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    synchronized (mStats) {
11056d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                        synchronized (this) {
11161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            final int numUidsToRemove = mUidsToRemove.size();
11261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            for (int i = 0; i < numUidsToRemove; i++) {
11361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                                mStats.removeIsolatedUidLocked(mUidsToRemove.get(i));
11461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            }
11561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        }
11661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        mUidsToRemove.clear();
11761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                    }
1184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_WRITE_TO_DISK:
121a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    updateExternalStats("write", UPDATE_ALL);
1224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    synchronized (mStats) {
1234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                        mStats.writeAsyncLocked();
1244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    }
1254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
1274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
1309f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        public void scheduleSync(String reason, int updateFlags) {
13161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            synchronized (this) {
1329f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                scheduleSyncLocked(reason, updateFlags);
13361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
134a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        }
135a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
13661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        @Override
13761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        public void scheduleCpuSyncDueToRemovedUid(int uid) {
138a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            synchronized (this) {
13961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                scheduleSyncLocked("remove-uid", UPDATE_CPU);
14061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                mUidsToRemove.add(uid);
14161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
14261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        }
14361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
14461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private void scheduleSyncLocked(String reason, int updateFlags) {
14561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            if (mUpdateFlags == 0) {
14661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason));
1474b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
14861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mUpdateFlags |= updateFlags;
1494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    BatteryStatsService(File systemDir, Handler handler) {
1534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Our handler here will be accessing the disk, use a different thread than
1544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // what the ActivityManagerService gave us (no I/O on that one!).
1554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler = new BatteryStatsHandler(FgThread.getHandler().getLooper());
1564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
1584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mStats = new BatteryStatsImpl(systemDir, handler, mHandler);
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void publish(Context context) {
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
163f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
164f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                com.android.internal.R.integer.config_radioScanningTimeout)
165f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                * 1000L);
166e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        mStats.setPowerProfile(new PowerProfile(context));
1676832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
1682c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1692c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
1702c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
1712c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
1722c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
1732c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
1742c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
175cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
176cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal.registerLowPowerModeObserver(this);
1778ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        mStats.notePowerSaveMode(mPowerManagerInternal.getLowPowerModeEnabled());
178c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
1792c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1802c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
18155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
1828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
1834b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1849f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        updateExternalStats("shutdown", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
18555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
1866b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
18755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
18855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
18955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
19491268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
198cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
199cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
200cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void onLowPowerModeChanged(boolean enabled) {
201cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
2028ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePowerSaveMode(enabled);
203cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
204cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
205cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
2204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK);
2214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
2242f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
225b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
226b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
227b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
228b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
229b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
230b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
231b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
232b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
233b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
2342f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
2352f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2362f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
2372f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2382f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2392f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2402f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
2412f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
24261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
2432f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2442f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2452f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2462f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
2472f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2482f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
2492f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2502f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2512f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2521e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
2531e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2541e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
2551e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2561e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2571e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
2581e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
2591e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2601e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
2611e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2621e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2631e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
264a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteProcessFinish(String name, int uid) {
2652f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
266a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
2672f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2682f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2692f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
270a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteUidProcessState(int uid, int state) {
2712f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
272a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteUidProcessStateLocked(uid, state);
2732f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2742f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2752f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2762f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
2772f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
2818a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
2828a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
2849f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        updateExternalStats("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
2854b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
2864b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
2874b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2920068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2930068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
2940068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
2950068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
2960068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
2970068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
2980068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
2999f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        updateExternalStats("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
3004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3030068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
3040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
3050068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
3060068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
3070068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
3080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
3090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
3100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3110068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
3120068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3134870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
3144870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
3154870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
3164870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
3174870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
3184870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
319ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
320ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
321ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
322ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
323ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
324ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
325ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
326ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
327ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
328ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
329ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
330ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
331ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
332ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
333099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
334099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
335099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
336099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
337099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
338099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
339099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
340fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
341fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
342fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
343fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
344fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
345fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
346fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
347fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
348fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
349fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
350fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
351fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
352fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
353fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
354fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
355fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
356fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
357fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
358fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
359fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
360fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
361fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobFinish(String name, int uid) {
362fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
363fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
364fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobFinishLocked(name, uid);
365fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
366fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
367fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
3681e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
3691e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3701e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3711e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
3721e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3731e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3741e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
3751e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
3761e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3771e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3781e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
3791e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3801e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3811e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
382a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
3833d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
386e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
38740c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
391cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
394cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
395cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
399a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
400a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
4017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
403a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
404a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
4057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
408cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
409cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
410e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
411e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
412e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
413cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
414e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
415e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
416e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
417e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
418cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
419cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
4207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
422cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
4237e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4299adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4369adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
440a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
441a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
442a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
443a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
444a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
445a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
446a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
447a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
448a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
449a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
450a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
451a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
452a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
453a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4576b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4646b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
468e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
471e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
475617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
476617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
477617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
478617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
479617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
480617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
481617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
482e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
485e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
488617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
489280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
490280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
491280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
492280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
493280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
494280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
495280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
496e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
497617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
498617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
499e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
500617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
501617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
502e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5031e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
5041e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
5051e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
5061e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
5071e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
5081e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
5091e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
5102ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn    public void noteMobileRadioPowerState(int powerState, long timestampNs) {
511e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
512e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
5132ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn            mStats.noteMobileRadioPowerState(powerState, timestampNs);
514e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
515e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
516e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
530105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
531e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
532627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
533627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
534e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
535627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
536627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
537627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
538627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
539627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
540627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
541627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
542627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
543627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
54432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
545f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
54632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
547e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
54832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
549e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
55032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
55132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
55232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
55358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
554105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
555105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
55658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
557105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
558105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
559105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
56058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
561105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
562105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
56358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
564105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
565105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
566d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
567244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
568244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
569244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
570244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
571244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
572244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
573244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
574244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
575244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
576244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
577244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
578244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
579244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
580244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
581244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
583244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
584244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
585244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
586244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
587244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
588244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
589244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
590244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
591244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
592244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
593244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
594244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
59510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
59610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
59710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
59810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
59910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
60010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
60110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
60210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
60310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
60410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
60510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
60610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
60710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
60810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
6096d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
610abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
611abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6126d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
613abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
614abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
615abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
6166d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
617abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
618abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6196d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
6206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
6246d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6266d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
6276d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6286d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6296d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6306d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
6316d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6326d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6336d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
6346d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6356d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6366d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6376d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
6386d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6396d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6406d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
6416d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6426d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6436d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6446d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
6456d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6466d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6476d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
648abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
649abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
650abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
651e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
652e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos) {
653e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
654e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
655e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
656e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
6570c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
658a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
65906f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
66006f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
66106f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
6629f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                mHandler.scheduleSync("wifi-data: " + type,
6639f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                        BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI);
664a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
6650c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn            mStats.noteWifiRadioPowerState(powerState, tsNanos);
6660c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
667e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
668e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
66958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
670d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
671d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
67258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
673d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
674d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
675d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
67658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
677d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
678d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
67958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
68058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
68158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
68258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
68358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
68458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
68558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
68658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
687d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
688d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
689d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
690ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
691ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
692ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
693ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
694ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
695ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
696ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
6973251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
6983251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
6993251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7003251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
7013251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7023251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7033251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7043251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
7053251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7063251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7073251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
7083251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7093251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7103251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
711105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
712105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
713105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
714105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
715105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
716105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
717105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
718105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
719105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
720105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
721105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
722105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
723105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7246ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
7256ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
726105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
727105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
7286ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
729105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
730105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7316ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
7326ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
734105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
7356ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
736105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
737105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
7405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
7415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
7425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
7435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
7475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
7485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
7495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
7505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
7547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
7577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
7617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
7647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7676ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
7687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7706ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
7717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7746ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
7757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7776ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
7787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
781a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
782a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
783a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
784a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
785a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
786a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
787a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
788a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
789a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
790a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
791a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
792a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
793a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
794a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
7957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
7967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
7997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
8037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
8047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
8077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8107a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
8121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
8131059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
8144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
8151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
8161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
8171059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
8187a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8197a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
8207a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
8217a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        synchronized (mStats) {
8227a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey            mStats.noteNetworkStatsEnabledLocked();
8237a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        }
8247a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
8257a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
8268ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
82708c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
8288ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8298ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
83008c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
8318ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8328ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8338ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8348ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
8358ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8368ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
8378ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
8388ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8398ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8408ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8418ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
8428ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8438ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
8448ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
8458ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8468ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8478ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8486771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
8496771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    public void noteBleScanStarted(WorkSource ws) {
8506771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
8519f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
8529f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteBluetoothScanStartedFromSourceLocked(ws);
8539f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
8546771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
8556771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
8566771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
8576771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    public void noteBleScanStopped(WorkSource ws) {
8586771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
8599f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
8609f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteBluetoothScanStoppedFromSourceLocked(ws);
8619f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
8629f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
8639f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
8649f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    @Override
8659f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public void noteResetBleScan() {
8669f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        enforceCallingPermission();
8679f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
8689f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteResetBluetoothScanLocked();
8699f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
8706771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
8716771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
876d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
877d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
878d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                                final int level, final int temp, final int volt) {
879d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
880d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
881d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
882d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
883d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        mHandler.post(new Runnable() {
884d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            @Override
885d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            public void run() {
886d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
887d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
888d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    if (mStats.isOnBattery() == onBattery) {
889d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        // The battery state has not changed, so we don't need to sync external
890d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        // stats immediately.
891d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
892d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        return;
893d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    }
894d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
895d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
896d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // Sync external stats first as the battery has changed states. If we don't sync
897d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // immediately here, we may not collect the relevant data later.
8989f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                updateExternalStats("battery-state", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
899d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
900d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
901d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
902d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            }
903d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
904633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
905633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
925c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
926c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
927515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
928515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
929515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
930515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
931c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
932c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
933c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
934c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
935c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
936c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
937c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
938c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
939515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
940515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
941515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
942515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
943515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
944515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
945515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
946515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
947515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
948c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
949515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
950515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
951c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
952515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
953c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
954c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
955c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
956c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
957c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
958c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
959515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
960515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
961515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
962515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
963515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
964515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
965515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
966515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
967515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
968515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
969515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
970515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
971515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
972515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
973515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
974515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
975515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
976515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
977515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
978515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
979515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
980515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
981515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
982515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
983c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
984c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
985515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
986c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
987ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
98891268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
9891e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
990d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
991865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
992865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
993865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --c: write the current stats in checkin format.");
994099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
995c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
996c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
997d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
998ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
999ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
1000d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
1001d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
1002cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
1003fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
1004fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
1005fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
1006fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
1007fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
10080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
10091e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
1010fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
1011ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1012ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1013cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1014cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1015cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1016cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1017cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1018cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1019cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
10200068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1021cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
10220068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1023cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
10249a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
10259a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
10269a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
10279a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1028cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1029cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1030cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1031cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1032cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1033cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1034cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1035cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
10364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
10393abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
10403abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                != PackageManager.PERMISSION_GRANTED) {
10413abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            pw.println("Permission Denial: can't dump BatteryStats from from pid="
10423abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
10433abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + " without permission " + android.Manifest.permission.DUMP);
10443abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            return;
10453abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        }
10463abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1047c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
10480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
10490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
10500ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
105116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
1052c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
1053cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
1054e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
1055c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
1056c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
1057e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
10580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
10590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
1060099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
1061c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1062c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
1063c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1064c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
1065c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
1066c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
1067c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
1068c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
1069c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1070c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
107116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
107249021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
10730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
1074c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
1075c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1076c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1077d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1078d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1079e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1080e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
10813d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1082e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
10830ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10859f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                    updateExternalStats("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
10860ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
10879f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                    updateExternalStats("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
10880ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
10890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
10900ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
10910ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
10920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1093d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1094d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1095d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1096d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1097d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1098d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1099d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1100d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1101d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1102d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1103d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1104d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1105fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1106cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1107cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1108cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1109cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1110cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1111cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1112fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1113cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1114cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1115cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1116cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1117cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1118cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1119ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1120ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1121ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1122e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1123a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1124cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
11250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1126ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1127cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1128cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1129cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1130cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1131e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey                        reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
1132cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1133cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1134cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1135cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1136cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1137cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1140e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
11410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
11420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
11430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
114413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
114513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
114613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
114713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
114813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
114913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
115013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
11519f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            updateExternalStats("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
115213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
115313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1154d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
115513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1156ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1157ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1158ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
11591e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1160ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1161ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1162ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1163ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1164ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
11654b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (useCheckinFormat) {
1167e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0);
11680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
11690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
11700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
11710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
11720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
11730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
11740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
11750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
11760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
11770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
11780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
11790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
11804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                                        null, mStats.mHandler, null);
11810068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
11820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
11830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
11840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
11850068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
11860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
11870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
11889ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
11890068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
11900068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
11910068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
11920068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
11930068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
11940068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
1195e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1196c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
119716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
119816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
119916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1200e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1201e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
1202e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1203c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
120416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
120516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
120616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1207e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Objects for extracting data from external sources.
12124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private final Object mExternalStatsLock = new Object();
12134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
12154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private IWifiManager mWifiManager;
12164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // WiFi keeps an accumulated total of stats, unlike Bluetooth.
12184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Keep the last WiFi stats so we can compute a delta.
12194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
12204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo mLastInfo = new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0);
12214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
12234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo pullWifiEnergyInfoLocked() {
12244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (mWifiManager == null) {
12254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mWifiManager = IWifiManager.Stub.asInterface(
12264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    ServiceManager.getService(Context.WIFI_SERVICE));
12274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (mWifiManager == null) {
12284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return null;
12294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
12304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
12314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        try {
12334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // We read the data even if we are not on battery. This is so that we keep the
12344b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // correct delta from when we should start reading (aka when we are on battery).
12354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            WifiActivityEnergyInfo info = mWifiManager.reportActivityInfo();
12364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
1237f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                if (info.mControllerEnergyUsed < 0 || info.mControllerIdleTimeMs < 0 ||
1238f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                        info.mControllerRxTimeMs < 0 || info.mControllerTxTimeMs < 0) {
1239f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                    Slog.wtf(TAG, "Reported WiFi energy data is invalid: " + info);
1240f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                    return null;
1241f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                }
1242f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski
1243bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long timePeriodMs = info.mTimestamp - mLastInfo.mTimestamp;
1244bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastIdleMs = mLastInfo.mControllerIdleTimeMs;
1245bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastTxMs = mLastInfo.mControllerTxTimeMs;
1246bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastRxMs = mLastInfo.mControllerRxTimeMs;
1247bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastEnergy = mLastInfo.mControllerEnergyUsed;
1248bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
12494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // We will modify the last info object to be the delta, and store the new
12504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // WifiActivityEnergyInfo object as our last one.
12514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                final WifiActivityEnergyInfo result = mLastInfo;
12524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mTimestamp = info.getTimeStamp();
12534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mStackState = info.getStackState();
1254f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski
1255f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                // These times seem to be the most reliable.
1256bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                result.mControllerTxTimeMs = info.mControllerTxTimeMs - lastTxMs;
1257bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                result.mControllerRxTimeMs = info.mControllerRxTimeMs - lastRxMs;
1258e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1259e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // WiFi calculates the idle time as a difference from the on time and the various
1260e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // Rx + Tx times. There seems to be some missing time there because this sometimes
1261e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // becomes negative. Just cap it at 0 and move on.
1262f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                // b/21613534
1263bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                result.mControllerIdleTimeMs = Math.max(0, info.mControllerIdleTimeMs - lastIdleMs);
1264f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                result.mControllerEnergyUsed =
1265bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                        Math.max(0, info.mControllerEnergyUsed - lastEnergy);
1266e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1267e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                if (result.mControllerTxTimeMs < 0 ||
1268e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        result.mControllerRxTimeMs < 0) {
1269e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // The stats were reset by the WiFi system (which is why our delta is negative).
1270e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // Returns the unaltered stats.
1271e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerEnergyUsed = info.mControllerEnergyUsed;
1272e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerRxTimeMs = info.mControllerRxTimeMs;
1273e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerTxTimeMs = info.mControllerTxTimeMs;
1274e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerIdleTimeMs = info.mControllerIdleTimeMs;
1275e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1276e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + result);
1277e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                }
1278bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
1279590da11a85d6e5201f3a96be7d30950e4b9178e5Todd Kennedy                // There is some accuracy error in reports so allow some slop in the results.
1280590da11a85d6e5201f3a96be7d30950e4b9178e5Todd Kennedy                final long SAMPLE_ERROR_MILLIS = 750;
1281bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long totalTimeMs = result.mControllerIdleTimeMs + result.mControllerRxTimeMs +
1282bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                        result.mControllerTxTimeMs;
12834c9ace51db6ded47665cbafce3edf8a92a67f775Adam Lesinski                if (totalTimeMs > timePeriodMs + SAMPLE_ERROR_MILLIS) {
1284bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    StringBuilder sb = new StringBuilder();
1285bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("Total time ");
1286bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(totalTimeMs, sb);
1287bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" is longer than sample period ");
1288bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(timePeriodMs, sb);
1289bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(".\n");
1290bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("Previous WiFi snapshot: ").append("idle=");
1291bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(lastIdleMs, sb);
1292bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" rx=");
1293bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(lastRxMs, sb);
1294bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" tx=");
1295bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(lastTxMs, sb);
1296bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" e=").append(lastEnergy);
1297bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("\n");
1298bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("Current WiFi snapshot: ").append("idle=");
1299bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(info.mControllerIdleTimeMs, sb);
1300bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" rx=");
1301bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(info.mControllerRxTimeMs, sb);
1302bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" tx=");
1303bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(info.mControllerTxTimeMs, sb);
1304bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" e=").append(info.mControllerEnergyUsed);
1305bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    Slog.wtf(TAG, sb.toString());
1306bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                }
1307bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
13084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mLastInfo = info;
13094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return result;
13104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
13114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        } catch (RemoteException e) {
13124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // Nothing to report, WiFi is dead.
13134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
13144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
13154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
13164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
13174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
13184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private BluetoothActivityEnergyInfo pullBluetoothEnergyInfoLocked() {
13194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
13204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (adapter != null) {
13214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            BluetoothActivityEnergyInfo info = adapter.getControllerActivityEnergyInfo(
13224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    BluetoothAdapter.ACTIVITY_ENERGY_INFO_REFRESHED);
13234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
13248a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                if (info.getControllerEnergyUsed() < 0 || info.getControllerIdleTimeMillis() < 0 ||
13258a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                        info.getControllerRxTimeMillis() < 0 || info.getControllerTxTimeMillis() < 0) {
13268a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                    Slog.wtf(TAG, "Bluetooth energy data is invalid: " + info);
13278a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                }
13284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return info;
13294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
13304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
13314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
13324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
13334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
133421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski    @GuardedBy("mExternalStatsLock")
133521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski    private ModemActivityInfo pullModemActivityInfoLocked() {
133621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        ITelephony tm = ITelephony.Stub.asInterface(ServiceManager.getService(
133721f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                Context.TELEPHONY_SERVICE));
133821f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        try {
133921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            if (tm != null) {
134021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                ModemActivityInfo info = tm.getModemActivityInfo();
134121f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                if (info == null || info.isValid()) {
134221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                    return info;
134321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                }
134421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                Slog.wtf(TAG, "Modem activity info is invalid: " + info);
134521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            }
134621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        } catch (RemoteException e) {
134721f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            // Nothing to do.
134821f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        }
134921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        return null;
135021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski    }
135121f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski
13524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
13534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates
13544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * batterystats with that information.
13554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     *
13564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * We first grab a lock specific to this method, then once all the data has been collected,
13574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * we grab the mStats lock and update the data.
1358c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     *
1359c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * @param reason The reason why this collection was requested. Useful for debugging.
1360a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski     * @param updateFlags Which external stats to update. Can be a combination of
13619f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_CPU},
13629f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_RADIO},
13639f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_WIFI},
13649f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    and {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_BT}.
13654b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
1366a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    void updateExternalStats(final String reason, final int updateFlags) {
13674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mExternalStatsLock) {
1368e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            if (mContext == null) {
1369e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // We haven't started yet (which means the BatteryStatsImpl object has
1370e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // no power profile. Don't consume data we can't compute yet.
1371e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                return;
1372e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            }
1373e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1374a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (BatteryStatsImpl.DEBUG_ENERGY) {
1375a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                Slog.d(TAG, "Updating external stats: reason=" + reason);
1376a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
1377a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1378a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            WifiActivityEnergyInfo wifiEnergyInfo = null;
13799f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) {
1380a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                wifiEnergyInfo = pullWifiEnergyInfoLocked();
1381a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
1382a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
138321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            ModemActivityInfo modemActivityInfo = null;
13849f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) {
138521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                modemActivityInfo = pullModemActivityInfoLocked();
138621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            }
138721f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski
1388a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            BluetoothActivityEnergyInfo bluetoothEnergyInfo = null;
13899f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) {
1390c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                // We only pull bluetooth stats when we have to, as we are not distributing its
1391c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                // use amongst apps and the sampling frequency does not matter.
1392c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                bluetoothEnergyInfo = pullBluetoothEnergyInfoLocked();
1393c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            }
1394c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski
13954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            synchronized (mStats) {
1396a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                final long elapsedRealtime = SystemClock.elapsedRealtime();
1397a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                final long uptime = SystemClock.uptimeMillis();
13980c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                if (mStats.mRecordAllHistory) {
13990c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                    mStats.addHistoryEventLocked(elapsedRealtime, uptime,
14000c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                            BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, reason, 0);
14010c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                }
140272478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski
14039f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_CPU) != 0) {
1404a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateCpuTimeLocked();
1405a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateKernelWakelocksLocked();
1406a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1407a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
14089f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) {
140921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                    mStats.updateMobileRadioStateLocked(elapsedRealtime, modemActivityInfo);
1410a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1411a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
14129f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) {
1413a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateWifiStateLocked(wifiEnergyInfo);
1414a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1415a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
14169f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) {
1417a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateBluetoothStateLocked(bluetoothEnergyInfo);
141872478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski                }
14194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
14204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
14214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1423