BatteryStatsService.java revision 9cfba3502079f5919ec065da2f8d86fe35c475da
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;
35713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.PowerManager;
36cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
40e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
41cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
43713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler;
44713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter;
45713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats;
4606f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
4721f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo;
48e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
49e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
5061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskiimport android.util.IntArray;
518a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
53bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinskiimport android.util.TimeUtils;
544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy;
5532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
56d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
5732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
58e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
5921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport com.android.internal.telephony.ITelephony;
604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.server.FgThread;
61cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
6232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
67515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
68515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
69515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
70515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
71515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
72713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays;
73e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
74713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Map;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
80cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
81cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        implements PowerManagerInternal.LowPowerModeListener {
82c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
83c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IBatteryStats sService;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
864b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    final BatteryStatsHandler mHandler;
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
88cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    PowerManagerInternal mPowerManagerInternal;
893f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync {
914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_SYNC_EXTERNAL_STATS = 1;
924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_WRITE_TO_DISK = 2;
93a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        private int mUpdateFlags = 0;
9461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private IntArray mUidsToRemove = new IntArray();
954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public BatteryStatsHandler(Looper looper) {
974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            super(looper);
984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
1014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public void handleMessage(Message msg) {
1024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            switch (msg.what) {
1034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_SYNC_EXTERNAL_STATS:
104a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    final int updateFlags;
105a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    synchronized (this) {
106a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        removeMessages(MSG_SYNC_EXTERNAL_STATS);
107a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        updateFlags = mUpdateFlags;
108a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        mUpdateFlags = 0;
109a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    }
110a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    updateExternalStats((String)msg.obj, updateFlags);
11156d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski
11256d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // other parts of the system could be calling into us
11356d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // from mStats in order to report of changes. We must grab the mStats
11456d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // lock before grabbing our own or we'll end up in a deadlock.
11556d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    synchronized (mStats) {
11656d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                        synchronized (this) {
11761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            final int numUidsToRemove = mUidsToRemove.size();
11861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            for (int i = 0; i < numUidsToRemove; i++) {
11961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                                mStats.removeIsolatedUidLocked(mUidsToRemove.get(i));
12061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            }
12161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        }
12261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        mUidsToRemove.clear();
12361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                    }
1244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_WRITE_TO_DISK:
127a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    updateExternalStats("write", UPDATE_ALL);
1284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    synchronized (mStats) {
1294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                        mStats.writeAsyncLocked();
1304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    }
1314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
1334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1344b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
1369f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        public void scheduleSync(String reason, int updateFlags) {
13761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            synchronized (this) {
1389f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                scheduleSyncLocked(reason, updateFlags);
13961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
140a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        }
141a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
14261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        @Override
14361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        public void scheduleCpuSyncDueToRemovedUid(int uid) {
144a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            synchronized (this) {
14561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                scheduleSyncLocked("remove-uid", UPDATE_CPU);
14661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                mUidsToRemove.add(uid);
14761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
14861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        }
14961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
15061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private void scheduleSyncLocked(String reason, int updateFlags) {
15161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            if (mUpdateFlags == 0) {
15261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason));
1534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
15461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mUpdateFlags |= updateFlags;
1554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    BatteryStatsService(File systemDir, Handler handler) {
1594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Our handler here will be accessing the disk, use a different thread than
1604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // what the ActivityManagerService gave us (no I/O on that one!).
1614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler = new BatteryStatsHandler(FgThread.getHandler().getLooper());
1624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
1644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mStats = new BatteryStatsImpl(systemDir, handler, mHandler);
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void publish(Context context) {
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
169f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
170f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                com.android.internal.R.integer.config_radioScanningTimeout)
171f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                * 1000L);
172e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        mStats.setPowerProfile(new PowerProfile(context));
1736832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
1742c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1752c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
1762c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
1772c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
1782c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
1792c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
1802c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
181cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
182cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal.registerLowPowerModeObserver(this);
1838ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        mStats.notePowerSaveMode(mPowerManagerInternal.getLowPowerModeEnabled());
184c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
1852c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1862c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
18755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
1888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
1894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1909f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        updateExternalStats("shutdown", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
19155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
1926b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
19355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
19455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
19555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20091268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
204cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
205cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
206cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void onLowPowerModeChanged(boolean enabled) {
207cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
2088ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePowerSaveMode(enabled);
209cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
210cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
211cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2200068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
2264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK);
2274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2292f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
2302f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
231b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
232b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
233b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
234b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
235b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
236b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
237b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
238b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
239b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
2402f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
2412f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2422f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
2432f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2442f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2452f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2462f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
2472f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
24861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
2492f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2502f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2512f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2522f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
2532f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2542f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
2552f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2562f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2572f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2581e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
2591e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2601e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
2611e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2621e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2631e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
2641e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
2651e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2661e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
2671e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2681e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2691e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
270a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteProcessFinish(String name, int uid) {
2712f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
272a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
2732f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2742f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2752f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
276a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteUidProcessState(int uid, int state) {
2772f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
278a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteUidProcessStateLocked(uid, state);
2792f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2802f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2812f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2822f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
2832f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
2878a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
2888a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
2909f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        updateExternalStats("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
2914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
2924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
2934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2980068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2990068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
3000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
3010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
3020068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
3030068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
3059f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        updateExternalStats("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
3064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
3100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
3110068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
3120068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
3130068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
3140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
3150068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
3160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3170068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
3180068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3194870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
3204870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
3214870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
3224870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
3234870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
3244870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
325ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
326ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
327ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
328ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
329ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
330ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
331ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
332ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
333ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
334ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
335ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
336ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
337ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
338ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
339099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
340099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
341099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
342099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
343099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
344099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
345099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
346fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
347fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
348fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
349fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
350fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
351fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
352fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
353fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
354fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
355fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
356fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
357fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
358fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
359fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
360fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
361fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
362fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
363fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
364fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
365fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
366fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
367fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobFinish(String name, int uid) {
368fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
369fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
370fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobFinishLocked(name, uid);
371fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
372fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
373fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
3741e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
3751e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3761e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3771e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
3781e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3791e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3801e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
3811e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
3821e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3831e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3841e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
3851e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3861e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3871e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
388a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
3893d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
392e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
39340c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
397cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
400cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
401cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
405a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
406a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
4077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
409a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
410a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
4117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
414cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
415cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
416e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
417e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
418e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
419cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
420e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
421e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
422e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
423e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
424cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
425cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
4267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4277e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
428cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
4297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4359adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4429adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
446a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
447a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
448a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
449a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
450a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
451a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
452a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
453a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
454a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
455a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
456a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
457a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
458a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
459a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4636b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4706b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
474e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
477e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
481617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
482617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
483617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
484617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
485617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
486617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
487617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
488e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
491e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
494617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
495280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
496280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
497280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
498280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
499280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
500280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
501280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
502e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
503617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
504617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
505e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
506617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
507617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
508e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5091e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
5101e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
5111e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
5121e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
5131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
5141e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
5151e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
5162ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn    public void noteMobileRadioPowerState(int powerState, long timestampNs) {
517e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
518e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
5192ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn            mStats.noteMobileRadioPowerState(powerState, timestampNs);
520e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
521e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
522e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
536105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
537e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
538627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
539627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
540e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
541627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
542627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
543627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
544627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
545627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
546627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
547627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
548627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
549627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
55032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
551f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
55232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
553e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
55432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
555e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
55632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
55732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
55832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
55958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
560105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
561105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
56258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
563105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
564105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
565105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
56658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
567105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
568105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
56958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
570105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
571105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
572d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
573244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
574244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
575244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
576244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
577244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
578244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
579244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
580244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
581244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
583244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
584244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
585244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
586244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
587244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
588244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
589244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
590244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
591244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
592244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
593244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
594244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
595244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
596244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
597244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
598244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
599244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
600244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
60110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
60210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
60310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
60410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
60510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
60610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
60710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
60810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
60910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
61010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
61110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
61210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
61310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
61410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
6156d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
616abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
617abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6186d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
619abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
620abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
621abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
6226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
623abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
624abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
6266d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6276d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6286d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6296d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
6306d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6316d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6326d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
6336d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6346d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6356d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6366d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
6376d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6386d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6396d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
6406d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6416d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6426d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6436d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
6446d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6456d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6466d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
6476d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6486d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6496d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6506d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
6516d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6526d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6536d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
654abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
655abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
656abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
657e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
658e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos) {
659e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
660e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
661e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
662e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
6630c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
664a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
66506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
66606f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
66706f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
6689f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                mHandler.scheduleSync("wifi-data: " + type,
6699f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                        BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI);
670a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
6710c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn            mStats.noteWifiRadioPowerState(powerState, tsNanos);
6720c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
673e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
674e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
67558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
676d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
677d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
67858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
679d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
680d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
681d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
68258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
683d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
684d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
68558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
68658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
68758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
68858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
68958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
69058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
69158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
69258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
693d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
694d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
695d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
696ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
697ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
698ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
699ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
700ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
701ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
702ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
7033251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
7043251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7053251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7063251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
7073251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7083251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7093251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7103251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
7113251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7123251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7133251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
7143251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7153251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7163251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
717105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
718105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
719105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
720105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
721105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
722105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
723105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
724105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
725105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
726105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
727105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
728105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
729105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7306ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
7316ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
732105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
7346ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
735105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
736105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7376ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
7386ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
739105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
740105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
7416ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
742105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
743105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
7465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
7475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
7485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
7495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
7535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
7545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
7555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
7565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
7607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
7637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
7677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
7707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7736ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
7747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7766ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
7777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7806ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
7817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7836ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
7847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
787a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
788a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
789a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
790a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
791a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
792a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
793a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
794a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
795a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
796a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
797a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
798a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
799a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
800a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
8017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
8027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
8057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
8097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
8107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
8137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8167a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
8181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
8191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
8204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
8211059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
8221059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
8231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
8247a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8257a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
8267a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
8277a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        synchronized (mStats) {
8287a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey            mStats.noteNetworkStatsEnabledLocked();
8297a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        }
8307a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
8317a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
8328ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
83308c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
8348ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8358ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
83608c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
8378ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8388ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8398ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8408ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
8418ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8428ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
8438ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
8448ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8458ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8468ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8478ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
8488ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8498ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
8508ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
8518ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8528ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8538ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8546771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
8556771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    public void noteBleScanStarted(WorkSource ws) {
8566771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
8579f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
8589f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteBluetoothScanStartedFromSourceLocked(ws);
8599f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
8606771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
8616771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
8626771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
8636771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    public void noteBleScanStopped(WorkSource ws) {
8646771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
8659f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
8669f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteBluetoothScanStoppedFromSourceLocked(ws);
8679f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
8689f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
8699f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
8709f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    @Override
8719f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public void noteResetBleScan() {
8729f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        enforceCallingPermission();
8739f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
8749f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteResetBluetoothScanLocked();
8759f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
8766771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
8776771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
882d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
883d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
884d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                                final int level, final int temp, final int volt) {
885d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
886d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
887d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
888d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
889d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        mHandler.post(new Runnable() {
890d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            @Override
891d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            public void run() {
892d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
893d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
894d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    if (mStats.isOnBattery() == onBattery) {
895d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        // The battery state has not changed, so we don't need to sync external
896d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        // stats immediately.
897d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
898d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        return;
899d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    }
900d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
901d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
902d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // Sync external stats first as the battery has changed states. If we don't sync
903d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // immediately here, we may not collect the relevant data later.
9049f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                updateExternalStats("battery-state", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
905d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
906d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
907d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
908d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            }
909d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
910633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
911633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
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.getAwakeTimeBattery();
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
931c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
932c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
933515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
934515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
935515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
936515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
937c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
938c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
939c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
940c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
941c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
942c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
943c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
944c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
945515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
946515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
947515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
948515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
949515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
950515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
951515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
952515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
953515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
954c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
955515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
956515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
957c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
958515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
959c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
960c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
961c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
962c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
963c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
964c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
965515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
966515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
967515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
968515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
969515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
970515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
971515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
972515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
973515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
974515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
975515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
976515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
977515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
978515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
979515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
980515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
981515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
982515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
983515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
984515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
985515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
986515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
987515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
988515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
989c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
990c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
991515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
992c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
993ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
99491268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
9951e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
996d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
997865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
998865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
999865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --c: write the current stats in checkin format.");
1000099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
1001c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
1002c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
1003d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
1004ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
1005ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
1006d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
1007d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
1008cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
1009fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
1010fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
1011fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
1012fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
1013fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
10140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
10151e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
1016fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
1017ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1018ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1019cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1020cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1021cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1022cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1023cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1024cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1025cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
10260068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1027cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
10280068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1029cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
10309a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
10319a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
10329a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
10339a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1034cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1035cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1036cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1037cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1038cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1039cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1040cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1041cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
10424b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
10453abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
10463abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                != PackageManager.PERMISSION_GRANTED) {
10473abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            pw.println("Permission Denial: can't dump BatteryStats from from pid="
10483abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
10493abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + " without permission " + android.Manifest.permission.DUMP);
10503abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            return;
10513abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        }
10523abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1053c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
10540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
10550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
10560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
105716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
1058c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
1059cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
1060e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
1061c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
1062c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
1063e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
10640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
10650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
1066099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
1067c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1068c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
1069c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1070c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
1071c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
1072c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
1073c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
1074c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
1075c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1076c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
107716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
107849021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
10790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
1080c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
1081c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1082c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1083d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1084d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1085e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1086e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
10873d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1088e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
10890ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
10919f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                    updateExternalStats("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
10920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
10939f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                    updateExternalStats("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
10940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
10950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
10960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
10970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
10980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1099d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1100d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1101d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1102d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1103d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1104d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1105d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1106d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1107d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1108d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1109d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1110d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1111fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1112cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1113cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1114cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1115cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1116cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1117cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1118fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1119cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1120cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1121cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1122cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1123cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1124cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1125ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1126ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1127ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1128e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1129a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1130cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
11310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1132ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1133cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1134cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1135cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1136cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1137e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey                        reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
1138cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1139cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1140cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1141cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1142cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1143cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1146e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
11470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
11480ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
11490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
115013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
115113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
115213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
115313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
115413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
115513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
115613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
11579f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            updateExternalStats("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
115813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
115913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1160d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
116113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1162ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1163ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1164ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
11651e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1166ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1167ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1168ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1169ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1170ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
11714b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (useCheckinFormat) {
11739cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
11749cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn                    PackageManager.MATCH_UNINSTALLED_PACKAGES | PackageManager.MATCH_ALL);
11750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
11760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
11770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
11780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
11790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
11800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
11810068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
11820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
11830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
11840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
11850068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
11860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
11874b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                                        null, mStats.mHandler, null);
11880068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
11890068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
11900068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
11910068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
11920068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
11930068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
11940068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
11959ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
11960068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
11970068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
11980068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
11990068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
12000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
12010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
1202e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1203c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
120416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
120516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
120616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1207e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1208e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
1209e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1210c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
121116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
121216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
121316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1214e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Objects for extracting data from external sources.
12194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private final Object mExternalStatsLock = new Object();
12204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
12224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private IWifiManager mWifiManager;
12234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // WiFi keeps an accumulated total of stats, unlike Bluetooth.
12254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Keep the last WiFi stats so we can compute a delta.
12264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
12274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo mLastInfo = new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0);
12284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
12304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo pullWifiEnergyInfoLocked() {
12314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (mWifiManager == null) {
12324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mWifiManager = IWifiManager.Stub.asInterface(
12334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    ServiceManager.getService(Context.WIFI_SERVICE));
12344b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (mWifiManager == null) {
12354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return null;
12364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
12374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
12384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        try {
12404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // We read the data even if we are not on battery. This is so that we keep the
12414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // correct delta from when we should start reading (aka when we are on battery).
12424b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            WifiActivityEnergyInfo info = mWifiManager.reportActivityInfo();
12434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
1244f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                if (info.mControllerEnergyUsed < 0 || info.mControllerIdleTimeMs < 0 ||
1245f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                        info.mControllerRxTimeMs < 0 || info.mControllerTxTimeMs < 0) {
1246f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                    Slog.wtf(TAG, "Reported WiFi energy data is invalid: " + info);
1247f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                    return null;
1248f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                }
1249f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski
1250bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long timePeriodMs = info.mTimestamp - mLastInfo.mTimestamp;
1251bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastIdleMs = mLastInfo.mControllerIdleTimeMs;
1252bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastTxMs = mLastInfo.mControllerTxTimeMs;
1253bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastRxMs = mLastInfo.mControllerRxTimeMs;
1254bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastEnergy = mLastInfo.mControllerEnergyUsed;
1255bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
12564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // We will modify the last info object to be the delta, and store the new
12574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // WifiActivityEnergyInfo object as our last one.
12584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                final WifiActivityEnergyInfo result = mLastInfo;
12594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mTimestamp = info.getTimeStamp();
12604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mStackState = info.getStackState();
1261f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski
1262f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                // These times seem to be the most reliable.
1263bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                result.mControllerTxTimeMs = info.mControllerTxTimeMs - lastTxMs;
1264bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                result.mControllerRxTimeMs = info.mControllerRxTimeMs - lastRxMs;
1265e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1266e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // WiFi calculates the idle time as a difference from the on time and the various
1267e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // Rx + Tx times. There seems to be some missing time there because this sometimes
1268e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // becomes negative. Just cap it at 0 and move on.
1269f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                // b/21613534
1270bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                result.mControllerIdleTimeMs = Math.max(0, info.mControllerIdleTimeMs - lastIdleMs);
1271f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                result.mControllerEnergyUsed =
1272bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                        Math.max(0, info.mControllerEnergyUsed - lastEnergy);
1273e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1274e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                if (result.mControllerTxTimeMs < 0 ||
1275e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        result.mControllerRxTimeMs < 0) {
1276e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // The stats were reset by the WiFi system (which is why our delta is negative).
1277e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // Returns the unaltered stats.
1278e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerEnergyUsed = info.mControllerEnergyUsed;
1279e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerRxTimeMs = info.mControllerRxTimeMs;
1280e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerTxTimeMs = info.mControllerTxTimeMs;
1281e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerIdleTimeMs = info.mControllerIdleTimeMs;
1282e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1283e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + result);
1284e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                }
1285bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
1286590da11a85d6e5201f3a96be7d30950e4b9178e5Todd Kennedy                // There is some accuracy error in reports so allow some slop in the results.
1287590da11a85d6e5201f3a96be7d30950e4b9178e5Todd Kennedy                final long SAMPLE_ERROR_MILLIS = 750;
1288bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long totalTimeMs = result.mControllerIdleTimeMs + result.mControllerRxTimeMs +
1289bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                        result.mControllerTxTimeMs;
12904c9ace51db6ded47665cbafce3edf8a92a67f775Adam Lesinski                if (totalTimeMs > timePeriodMs + SAMPLE_ERROR_MILLIS) {
1291bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    StringBuilder sb = new StringBuilder();
1292bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("Total time ");
1293bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(totalTimeMs, sb);
1294bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" is longer than sample period ");
1295bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(timePeriodMs, sb);
1296bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(".\n");
1297bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("Previous WiFi snapshot: ").append("idle=");
1298bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(lastIdleMs, sb);
1299bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" rx=");
1300bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(lastRxMs, sb);
1301bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" tx=");
1302bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(lastTxMs, sb);
1303bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" e=").append(lastEnergy);
1304bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("\n");
1305bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("Current WiFi snapshot: ").append("idle=");
1306bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(info.mControllerIdleTimeMs, sb);
1307bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" rx=");
1308bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(info.mControllerRxTimeMs, sb);
1309bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" tx=");
1310bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(info.mControllerTxTimeMs, sb);
1311bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" e=").append(info.mControllerEnergyUsed);
1312bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    Slog.wtf(TAG, sb.toString());
1313bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                }
1314bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
13154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mLastInfo = info;
13164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return result;
13174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
13184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        } catch (RemoteException e) {
13194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // Nothing to report, WiFi is dead.
13204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
13214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
13224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
13234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
13244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
13254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private BluetoothActivityEnergyInfo pullBluetoothEnergyInfoLocked() {
13264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
13274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (adapter != null) {
13284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            BluetoothActivityEnergyInfo info = adapter.getControllerActivityEnergyInfo(
13294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    BluetoothAdapter.ACTIVITY_ENERGY_INFO_REFRESHED);
13304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
13318a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                if (info.getControllerEnergyUsed() < 0 || info.getControllerIdleTimeMillis() < 0 ||
13328a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                        info.getControllerRxTimeMillis() < 0 || info.getControllerTxTimeMillis() < 0) {
13338a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                    Slog.wtf(TAG, "Bluetooth energy data is invalid: " + info);
13348a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                }
13354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return info;
13364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
13374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
13384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
13394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
13404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
134121f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski    @GuardedBy("mExternalStatsLock")
134221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski    private ModemActivityInfo pullModemActivityInfoLocked() {
134321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        ITelephony tm = ITelephony.Stub.asInterface(ServiceManager.getService(
134421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                Context.TELEPHONY_SERVICE));
134521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        try {
134621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            if (tm != null) {
134721f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                ModemActivityInfo info = tm.getModemActivityInfo();
134821f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                if (info == null || info.isValid()) {
134921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                    return info;
135021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                }
135121f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                Slog.wtf(TAG, "Modem activity info is invalid: " + info);
135221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            }
135321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        } catch (RemoteException e) {
135421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            // Nothing to do.
135521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        }
135621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        return null;
135721f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski    }
135821f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski
13594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
13604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates
13614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * batterystats with that information.
13624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     *
13634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * We first grab a lock specific to this method, then once all the data has been collected,
13644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * we grab the mStats lock and update the data.
1365c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     *
1366c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * @param reason The reason why this collection was requested. Useful for debugging.
1367a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski     * @param updateFlags Which external stats to update. Can be a combination of
13689f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_CPU},
13699f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_RADIO},
13709f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_WIFI},
13719f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    and {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_BT}.
13724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
1373a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    void updateExternalStats(final String reason, final int updateFlags) {
13744b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mExternalStatsLock) {
1375e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            if (mContext == null) {
1376e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // We haven't started yet (which means the BatteryStatsImpl object has
1377e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // no power profile. Don't consume data we can't compute yet.
1378e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                return;
1379e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            }
1380e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1381a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (BatteryStatsImpl.DEBUG_ENERGY) {
1382a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                Slog.d(TAG, "Updating external stats: reason=" + reason);
1383a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
1384a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1385a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            WifiActivityEnergyInfo wifiEnergyInfo = null;
13869f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) {
1387a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                wifiEnergyInfo = pullWifiEnergyInfoLocked();
1388a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
1389a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
139021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            ModemActivityInfo modemActivityInfo = null;
13919f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) {
139221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                modemActivityInfo = pullModemActivityInfoLocked();
139321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            }
139421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski
1395a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            BluetoothActivityEnergyInfo bluetoothEnergyInfo = null;
13969f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) {
1397c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                // We only pull bluetooth stats when we have to, as we are not distributing its
1398c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                // use amongst apps and the sampling frequency does not matter.
1399c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                bluetoothEnergyInfo = pullBluetoothEnergyInfoLocked();
1400c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            }
1401c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski
14024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            synchronized (mStats) {
1403a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                final long elapsedRealtime = SystemClock.elapsedRealtime();
1404a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                final long uptime = SystemClock.uptimeMillis();
14050c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                if (mStats.mRecordAllHistory) {
14060c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                    mStats.addHistoryEventLocked(elapsedRealtime, uptime,
14070c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                            BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, reason, 0);
14080c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                }
140972478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski
14109f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_CPU) != 0) {
1411a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateCpuTimeLocked();
1412a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateKernelWakelocksLocked();
1413a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1414a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
14159f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) {
141621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski                    mStats.updateMobileRadioStateLocked(elapsedRealtime, modemActivityInfo);
1417a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1418a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
14199f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) {
1420a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateWifiStateLocked(wifiEnergyInfo);
1421a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1422a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
14239f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) {
1424a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateBluetoothStateLocked(bluetoothEnergyInfo);
142572478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski                }
14264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
14274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
14284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1429713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1430713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1431713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a particular uid.
1432713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1433713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1434713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler takeUidSnapshot(int requestUid) {
1435713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (requestUid != Binder.getCallingUid()) {
1436713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1437713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1438713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1439713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1440713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1441713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            updateExternalStats("get-health-stats-for-uid",
1442713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
1443713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1444713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return getHealthStatsForUidLocked(requestUid);
1445713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1446713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
1447713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Slog.d(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
1448713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1449713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1450713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1451713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1452713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1453713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1454713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1455713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a number of uids.
1456713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1457713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1458713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) {
1459713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (!onlyCaller(requestUids)) {
1460713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1461713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1462713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1463713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1464713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        int i=-1;
1465713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1466713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            updateExternalStats("get-health-stats-for-uids",
1467713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
1468713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1469713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final int N = requestUids.length;
1470713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final HealthStatsParceler[] results = new HealthStatsParceler[N];
1471713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                for (i=0; i<N; i++) {
1472713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    results[i] = getHealthStatsForUidLocked(requestUids[i]);
1473713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                }
1474713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return results;
1475713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1476713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
1477713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
1478713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    + Arrays.toString(requestUids) + ") i=" + i, ex);
1479713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1480713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1481713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1482713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1483713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1484713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1485713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1486713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Returns whether the Binder.getCallingUid is the only thing in requestUids.
1487713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1488713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    private static boolean onlyCaller(int[] requestUids) {
1489713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int caller = Binder.getCallingUid();
1490713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int N = requestUids.length;
1491713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        for (int i=0; i<N; i++) {
1492713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            if (requestUids[i] != caller) {
1493713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return false;
1494713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1495713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1496713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return true;
1497713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1498713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1499713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1500713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a HealthStatsParceler for the given uid. You should probably call
1501713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * updateExternalStats first.
1502713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1503713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    HealthStatsParceler getHealthStatsForUidLocked(int requestUid) {
1504713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter();
1505713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS);
1506713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid);
1507713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (uid != null) {
1508713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            writer.writeUid(uidWriter, mStats, uid);
1509713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1510713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return new HealthStatsParceler(uidWriter);
1511713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1512713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1514