BatteryStatsService.java revision 08c47a5dece977a55d250d98bda9e2a8df8b6ed0
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo;
203f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothAdapter;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
22e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo;
233abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager;
244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.IWifiManager;
254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo;
2691268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
286f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Looper;
314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Message;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
330068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor;
349ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException;
35cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
39e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
40cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
4206f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
43e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
44e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
4561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskiimport android.util.IntArray;
468a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
48bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinskiimport android.util.TimeUtils;
494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy;
5032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
51d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
5232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
53e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.server.FgThread;
55cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
5632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
61515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
62515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
63515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
64515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
65515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
66e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
72cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
73cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        implements PowerManagerInternal.LowPowerModeListener {
74c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
75c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static IBatteryStats sService;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    final BatteryStatsHandler mHandler;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    Context mContext;
80cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    PowerManagerInternal mPowerManagerInternal;
813f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
82a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    final int UPDATE_CPU = 0x01;
83a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    final int UPDATE_WIFI = 0x02;
84a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    final int UPDATE_RADIO = 0x04;
85a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    final int UPDATE_BT = 0x08;
86a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    final int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT;
87a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync {
894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_SYNC_EXTERNAL_STATS = 1;
904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_WRITE_TO_DISK = 2;
91a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        private int mUpdateFlags = 0;
9261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private IntArray mUidsToRemove = new IntArray();
934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public BatteryStatsHandler(Looper looper) {
954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            super(looper);
964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public void handleMessage(Message msg) {
1004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            switch (msg.what) {
1014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_SYNC_EXTERNAL_STATS:
102a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    final int updateFlags;
103a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    synchronized (this) {
104a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        removeMessages(MSG_SYNC_EXTERNAL_STATS);
105a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        updateFlags = mUpdateFlags;
106a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        mUpdateFlags = 0;
107a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    }
108a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    updateExternalStats((String)msg.obj, updateFlags);
10956d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski
11056d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // other parts of the system could be calling into us
11156d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // from mStats in order to report of changes. We must grab the mStats
11256d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // lock before grabbing our own or we'll end up in a deadlock.
11356d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    synchronized (mStats) {
11456d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                        synchronized (this) {
11561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            final int numUidsToRemove = mUidsToRemove.size();
11661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            for (int i = 0; i < numUidsToRemove; i++) {
11761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                                mStats.removeIsolatedUidLocked(mUidsToRemove.get(i));
11861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            }
11961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        }
12061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        mUidsToRemove.clear();
12161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                    }
1224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_WRITE_TO_DISK:
125a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    updateExternalStats("write", UPDATE_ALL);
1264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    synchronized (mStats) {
1274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                        mStats.writeAsyncLocked();
1284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    }
1294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
1314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
1340c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        public void scheduleSync(String reason) {
13561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            synchronized (this) {
13661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                scheduleSyncLocked(reason, UPDATE_ALL);
13761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
138a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        }
139a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
140a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        @Override
141a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        public void scheduleWifiSync(String reason) {
14261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            synchronized (this) {
14361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                scheduleSyncLocked(reason, UPDATE_WIFI);
14461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
145a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        }
146a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
14761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        @Override
14861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        public void scheduleCpuSyncDueToRemovedUid(int uid) {
149a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            synchronized (this) {
15061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                scheduleSyncLocked("remove-uid", UPDATE_CPU);
15161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                mUidsToRemove.add(uid);
15261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
15361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        }
15461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
15561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private void scheduleSyncLocked(String reason, int updateFlags) {
15661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            if (mUpdateFlags == 0) {
15761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason));
1584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
15961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mUpdateFlags |= updateFlags;
1604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    BatteryStatsService(File systemDir, Handler handler) {
1644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Our handler here will be accessing the disk, use a different thread than
1654b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // what the ActivityManagerService gave us (no I/O on that one!).
1664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler = new BatteryStatsHandler(FgThread.getHandler().getLooper());
1674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1684b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
1694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mStats = new BatteryStatsImpl(systemDir, handler, mHandler);
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void publish(Context context) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
174f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
175f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                com.android.internal.R.integer.config_radioScanningTimeout)
176f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                * 1000L);
177e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        mStats.setPowerProfile(new PowerProfile(context));
1786832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
1792c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1802c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
1812c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
1822c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
1832c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
1842c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
1852c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
186cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
187cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        mPowerManagerInternal.registerLowPowerModeObserver(this);
1888ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        mStats.notePowerSaveMode(mPowerManagerInternal.getLowPowerModeEnabled());
189c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
1902c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1912c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
19255280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
1938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
1944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
195a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        updateExternalStats("shutdown", UPDATE_ALL);
19655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
1976b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
19855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
19955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
20055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20591268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
209cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
210cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
211cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void onLowPowerModeChanged(boolean enabled) {
212cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
2138ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePowerSaveMode(enabled);
214cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
215cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
216cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2250068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
2314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK);
2324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2342f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
2352f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
236b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
237b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
238b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
239b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
240b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
241b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
242b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
243b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
244b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
2452f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
2462f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2472f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
2482f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2492f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2502f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2512f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
2522f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
25361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
2542f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2552f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2562f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2572f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
2582f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2592f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
2602f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2612f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2622f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2631e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
2641e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2651e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
2661e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2671e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2681e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
2691e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
2701e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2711e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
2721e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2731e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2741e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
2752f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessState(String name, int uid, int state) {
2762f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2772f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStateLocked(name, uid, state);
2782f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2792f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2802f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2812f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessFinish(String name, int uid) {
2822f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2832f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
2842f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2852f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2862f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2872f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
2882f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
2928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
2938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
295a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        updateExternalStats("get-stats", UPDATE_ALL);
2964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
2974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
2984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3030068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
3050068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
3060068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
3070068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
3080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
310a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        updateExternalStats("get-stats", UPDATE_ALL);
3114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
3150068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
3160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
3170068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
3180068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
3190068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
3200068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
3210068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3220068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
3230068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3244870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
3254870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
3264870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
3274870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
3284870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
3294870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
330ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
331ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
332ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
333ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
334ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
335ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
336ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
337ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
338ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
339ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
340ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
341ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
342ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
343ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
344099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
345099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
346099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
347099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
348099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
349099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
350099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
351fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
352fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
353fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
354fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
355fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
356fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
357fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
358fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
359fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
360fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
361fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
362fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
363fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
364fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
365fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
366fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
367fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
368fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
369fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
370fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
371fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
372fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobFinish(String name, int uid) {
373fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
374fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
375fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobFinishLocked(name, uid);
376fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
377fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
378fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
3791e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
3801e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3811e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3821e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
3831e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3841e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3851e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
3861e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
3871e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3881e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3891e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
3901e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3911e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3921e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
393a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
3943d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
397e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
39840c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
402cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
405cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
406cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
410a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
411a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
4127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
414a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
415a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
4167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
419cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
420cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
421e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
422e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
423e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
424cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
425e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
426e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
427e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
428e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
429cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
430cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
4317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
433cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
4347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4409adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4479adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
451a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
452a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
453a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
454a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
455a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
456a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
457a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
458a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
459a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
460a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
461a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
462a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
463a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
464a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4686b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4756b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
482e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
486617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
487617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
488617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
489617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
490617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
491617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
492617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
493e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
496e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
499617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
500280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
501280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
502280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
503280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
504280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
505280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
506280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
507e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
508617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
509617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
510e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
511617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
512617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
513e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5141e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
5151e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
5161e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
5171e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
5181e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
5191e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
5201e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
5212ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn    public void noteMobileRadioPowerState(int powerState, long timestampNs) {
522e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
523e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
5242ffa11e4b71c545e34533ef827bdc1a07fbe8246Dianne Hackborn            mStats.noteMobileRadioPowerState(powerState, timestampNs);
525e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
526e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
527e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
541105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
542e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
543627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
544627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
545e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
546627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
547627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
548627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
549627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
550627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
551627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
552627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
553627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
554627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
55532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
556f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
55732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
558e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
55932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
560e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
56132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
56232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
56332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
56458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
565105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
566105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
56758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
568105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
569105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
570105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
57158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
572105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
573105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
57458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
575105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
576105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
577d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
578244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
579244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
580244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
581244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
582244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
583244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
584244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
585244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
586244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
587244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
588244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
589244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
590244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
591244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
592244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
593244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
594244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
595244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
596244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
597244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
598244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
599244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
600244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
601244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
602244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
603244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
604244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
605244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
60610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
60710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
60810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
60910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
61010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
61110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
61210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
61310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
61410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
61510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
61610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
61710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
61810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
61910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
6206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
621abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
622abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
624abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
625abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
626abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
6276d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
628abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
629abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6306d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
6316d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6326d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6336d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6346d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
6356d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6366d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6376d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
6386d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6396d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6406d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6416d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
6426d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6436d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6446d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
6456d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6466d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6476d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6486d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
6496d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6506d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6516d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
6526d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6536d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6546d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6556d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
6566d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6576d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6586d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
659abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
660abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
661abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
662e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
663e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos) {
664e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
665e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
666e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
667e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
6680c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
669a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
67006f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
67106f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
67206f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
67306f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                mHandler.scheduleWifiSync("wifi-data: " + type);
674a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
6750c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn            mStats.noteWifiRadioPowerState(powerState, tsNanos);
6760c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
677e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
678e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
67958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
680d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
681d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
68258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
683d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
684d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
685d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
68658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
687d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
688d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
68958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
69058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
69158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
69258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
69358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
69458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
69558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
69658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
697d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
698d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
699d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
700ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
701ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
702ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
703ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
704ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
705ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
706ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
7073251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
7083251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7093251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7103251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
7113251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7123251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7133251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7143251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
7153251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7163251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7173251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
7183251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7193251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7203251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
721105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
722105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
723105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
724105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
725105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
726105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
727105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
728105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
729105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
730105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
731105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
732105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
733105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7346ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
7356ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
736105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
737105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
7386ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
739105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
740105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7416ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
7426ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
743105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
744105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
7456ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
746105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
747105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
7505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
7515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
7525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
7535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7565347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
7575347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
7585347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
7595347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
7605347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7615347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7625347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
7647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
7677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
7717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
7747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7776ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
7787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7806ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
7817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7846ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
7857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7876ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
7887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
791a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
792a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
793a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
794a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
795a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
796a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
797a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
798a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
799a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
800a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
801a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
802a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
803a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
804a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
8057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
8067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
8097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
8137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
8147e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8157e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
8177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8197e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8207a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
8221059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
8231059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
8244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
8251059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
8261059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
8271059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
8287a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8297a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
8307a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
8317a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        synchronized (mStats) {
8327a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey            mStats.noteNetworkStatsEnabledLocked();
8337a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        }
8347a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
8357a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
8368ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
83708c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
8388ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8398ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
84008c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
8418ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8428ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8438ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8448ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
8458ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8468ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
8478ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
8488ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8498ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8508ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8518ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
8528ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8538ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
8548ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
8558ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8568ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8578ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
862d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
863d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
864d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                                final int level, final int temp, final int volt) {
865d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
866d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
867d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
868d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
869d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        mHandler.post(new Runnable() {
870d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            @Override
871d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            public void run() {
872d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
873d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
874d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    if (mStats.isOnBattery() == onBattery) {
875d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        // The battery state has not changed, so we don't need to sync external
876d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        // stats immediately.
877d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
878d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        return;
879d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    }
880d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
881d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
882d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // Sync external stats first as the battery has changed states. If we don't sync
883d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // immediately here, we may not collect the relevant data later.
884d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                updateExternalStats("battery-state", UPDATE_ALL);
885d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
886d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt);
887d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
888d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            }
889d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
890633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
891633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
911c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
912c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
913515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
914515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
915515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
916515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
917c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
918c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
919c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
920c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
921c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
922c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
923c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
924c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
925515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
926515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
927515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
928515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
929515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
930515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
931515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
932515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
933515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
934c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
935515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
936515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
937c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
938515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
939c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
940c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
941c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
942c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
943c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
944c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
945515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
946515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
947515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
948515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
949515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
950515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
951515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
952515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
953515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
954515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
955515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
956515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
957515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
958515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
959515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
960515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
961515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
962515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
963515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
964515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
965515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
966515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
967515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
968515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
969c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
970c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
971515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
972c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
973ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
97491268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
9751e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
976d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
977865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
978865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
979865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --c: write the current stats in checkin format.");
980099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
981c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
982c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
983d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
984ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
985ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
986d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
987d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
988cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
989fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
990fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
991fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
992fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
993fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
9940068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
9951e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
996fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
997ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
998ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
999cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1000cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1001cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1002cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1003cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1004cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1005cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
10060068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1007cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
10080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1009cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
10109a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
10119a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
10129a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
10139a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1014cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1015cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1016cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1017cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1018cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1019cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1020cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1021cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
10224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
10253abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
10263abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                != PackageManager.PERMISSION_GRANTED) {
10273abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            pw.println("Permission Denial: can't dump BatteryStats from from pid="
10283abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
10293abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + " without permission " + android.Manifest.permission.DUMP);
10303abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            return;
10313abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        }
10323abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1033c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
10340068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
10350068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
10360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
103716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
1038c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
1039cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
1040e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
1041c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
1042c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
1043e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
10440068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
10450068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
1046099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
1047c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1048c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
1049c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1050c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
1051c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
1052c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
1053c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
1054c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
1055c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1056c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
105716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
105849021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
10590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
1060c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
1061c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1062c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1063d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1064d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1065e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1066e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
10673d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1068e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
10690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1071a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    updateExternalStats("dump", UPDATE_ALL);
10720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
1073a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    updateExternalStats("dump", UPDATE_ALL);
10740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
10750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
10760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
10770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
10780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1079d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1080d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1081d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1082d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1083d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1084d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1085d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1086d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1087d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1088d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1089d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1090d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1091fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1092cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1093cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1094cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1095cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1096cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1097cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1098fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1099cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1100cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1101cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1102cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1103cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1104cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1105ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1106ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1107ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1108e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1109a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1110cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
11110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1112ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1113cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1114cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1115cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1116cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1117cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        reqUid = mContext.getPackageManager().getPackageUid(arg,
1118cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1119cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1120cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1121cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1122cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1123cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1126e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
11270ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
11280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
11290ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
113013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
113113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
113213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
113313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
113413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
113513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
113613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
1137a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            updateExternalStats("dump", UPDATE_ALL);
113813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
113913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1140d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
114113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1142ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1143ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1144ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
11451e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1146ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1147ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1148ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1149ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1150ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
11514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (useCheckinFormat) {
1153e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(0);
11540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
11550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
11560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
11570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
11580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
11590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
11600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
11610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
11620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
11630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
11640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
11650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
11664b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                                        null, mStats.mHandler, null);
11670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
11680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
11690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
11700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
11710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
11720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
11730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
11749ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
11750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
11760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
11770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
11780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
11790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
11800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
1181e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1182c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
118316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
118416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
118516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1186e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1187e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
1188e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1189c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
119016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
119116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
119216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1193e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Objects for extracting data from external sources.
11984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private final Object mExternalStatsLock = new Object();
11994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
12014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private IWifiManager mWifiManager;
12024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // WiFi keeps an accumulated total of stats, unlike Bluetooth.
12044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    // Keep the last WiFi stats so we can compute a delta.
12054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
12064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo mLastInfo = new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0);
12074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
12094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private WifiActivityEnergyInfo pullWifiEnergyInfoLocked() {
12104b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (mWifiManager == null) {
12114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mWifiManager = IWifiManager.Stub.asInterface(
12124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    ServiceManager.getService(Context.WIFI_SERVICE));
12134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (mWifiManager == null) {
12144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return null;
12154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
12164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
12174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        try {
12194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // We read the data even if we are not on battery. This is so that we keep the
12204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // correct delta from when we should start reading (aka when we are on battery).
12214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            WifiActivityEnergyInfo info = mWifiManager.reportActivityInfo();
12224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
1223f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                if (info.mControllerEnergyUsed < 0 || info.mControllerIdleTimeMs < 0 ||
1224f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                        info.mControllerRxTimeMs < 0 || info.mControllerTxTimeMs < 0) {
1225f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                    Slog.wtf(TAG, "Reported WiFi energy data is invalid: " + info);
1226f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                    return null;
1227f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                }
1228f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski
1229bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long timePeriodMs = info.mTimestamp - mLastInfo.mTimestamp;
1230bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastIdleMs = mLastInfo.mControllerIdleTimeMs;
1231bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastTxMs = mLastInfo.mControllerTxTimeMs;
1232bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastRxMs = mLastInfo.mControllerRxTimeMs;
1233bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long lastEnergy = mLastInfo.mControllerEnergyUsed;
1234bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
12354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // We will modify the last info object to be the delta, and store the new
12364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                // WifiActivityEnergyInfo object as our last one.
12374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                final WifiActivityEnergyInfo result = mLastInfo;
12384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mTimestamp = info.getTimeStamp();
12394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                result.mStackState = info.getStackState();
1240f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski
1241f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                // These times seem to be the most reliable.
1242bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                result.mControllerTxTimeMs = info.mControllerTxTimeMs - lastTxMs;
1243bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                result.mControllerRxTimeMs = info.mControllerRxTimeMs - lastRxMs;
1244e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1245e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // WiFi calculates the idle time as a difference from the on time and the various
1246e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // Rx + Tx times. There seems to be some missing time there because this sometimes
1247e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // becomes negative. Just cap it at 0 and move on.
1248f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                // b/21613534
1249bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                result.mControllerIdleTimeMs = Math.max(0, info.mControllerIdleTimeMs - lastIdleMs);
1250f4013aa4f7f9ba0010840c20fd747b73880f3d74Adam Lesinski                result.mControllerEnergyUsed =
1251bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                        Math.max(0, info.mControllerEnergyUsed - lastEnergy);
1252e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1253e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                if (result.mControllerTxTimeMs < 0 ||
1254e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                        result.mControllerRxTimeMs < 0) {
1255e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // The stats were reset by the WiFi system (which is why our delta is negative).
1256e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    // Returns the unaltered stats.
1257e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerEnergyUsed = info.mControllerEnergyUsed;
1258e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerRxTimeMs = info.mControllerRxTimeMs;
1259e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerTxTimeMs = info.mControllerTxTimeMs;
1260e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    result.mControllerIdleTimeMs = info.mControllerIdleTimeMs;
1261e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1262e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                    Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + result);
1263e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                }
1264bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
1265590da11a85d6e5201f3a96be7d30950e4b9178e5Todd Kennedy                // There is some accuracy error in reports so allow some slop in the results.
1266590da11a85d6e5201f3a96be7d30950e4b9178e5Todd Kennedy                final long SAMPLE_ERROR_MILLIS = 750;
1267bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                final long totalTimeMs = result.mControllerIdleTimeMs + result.mControllerRxTimeMs +
1268bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                        result.mControllerTxTimeMs;
12694c9ace51db6ded47665cbafce3edf8a92a67f775Adam Lesinski                if (totalTimeMs > timePeriodMs + SAMPLE_ERROR_MILLIS) {
1270bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    StringBuilder sb = new StringBuilder();
1271bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("Total time ");
1272bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(totalTimeMs, sb);
1273bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" is longer than sample period ");
1274bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(timePeriodMs, sb);
1275bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(".\n");
1276bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("Previous WiFi snapshot: ").append("idle=");
1277bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(lastIdleMs, sb);
1278bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" rx=");
1279bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(lastRxMs, sb);
1280bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" tx=");
1281bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(lastTxMs, sb);
1282bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" e=").append(lastEnergy);
1283bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("\n");
1284bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append("Current WiFi snapshot: ").append("idle=");
1285bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(info.mControllerIdleTimeMs, sb);
1286bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" rx=");
1287bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(info.mControllerRxTimeMs, sb);
1288bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" tx=");
1289bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    TimeUtils.formatDuration(info.mControllerTxTimeMs, sb);
1290bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    sb.append(" e=").append(info.mControllerEnergyUsed);
1291bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                    Slog.wtf(TAG, sb.toString());
1292bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski                }
1293bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinski
12944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                mLastInfo = info;
12954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return result;
12964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
12974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        } catch (RemoteException e) {
12984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            // Nothing to report, WiFi is dead.
12994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
13004b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
13014b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
13024b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
13034b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @GuardedBy("mExternalStatsLock")
13044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    private BluetoothActivityEnergyInfo pullBluetoothEnergyInfoLocked() {
13054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
13064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        if (adapter != null) {
13074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            BluetoothActivityEnergyInfo info = adapter.getControllerActivityEnergyInfo(
13084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    BluetoothAdapter.ACTIVITY_ENERGY_INFO_REFRESHED);
13094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            if (info != null && info.isValid()) {
13108a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                if (info.getControllerEnergyUsed() < 0 || info.getControllerIdleTimeMillis() < 0 ||
13118a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                        info.getControllerRxTimeMillis() < 0 || info.getControllerTxTimeMillis() < 0) {
13128a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                    Slog.wtf(TAG, "Bluetooth energy data is invalid: " + info);
13138a351373881e2e11c2636d6f9445f9df9accbaceAdam Lesinski                }
13144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                return info;
13154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
13164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
13174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        return null;
13184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
13194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
13204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
13214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates
13224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * batterystats with that information.
13234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     *
13244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * We first grab a lock specific to this method, then once all the data has been collected,
13254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * we grab the mStats lock and update the data.
1326c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     *
1327c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * @param reason The reason why this collection was requested. Useful for debugging.
1328a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski     * @param updateFlags Which external stats to update. Can be a combination of
1329a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski     *                    {@link #UPDATE_CPU}, {@link #UPDATE_RADIO}, {@link #UPDATE_WIFI},
1330a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski     *                    and {@link #UPDATE_BT}.
13314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
1332a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski    void updateExternalStats(final String reason, final int updateFlags) {
13334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mExternalStatsLock) {
1334e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            if (mContext == null) {
1335e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // We haven't started yet (which means the BatteryStatsImpl object has
1336e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                // no power profile. Don't consume data we can't compute yet.
1337e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                return;
1338e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            }
1339e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
1340a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (BatteryStatsImpl.DEBUG_ENERGY) {
1341a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                Slog.d(TAG, "Updating external stats: reason=" + reason);
1342a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
1343a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1344a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            WifiActivityEnergyInfo wifiEnergyInfo = null;
1345a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if ((updateFlags & UPDATE_WIFI) != 0) {
1346a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                wifiEnergyInfo = pullWifiEnergyInfoLocked();
1347a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
1348a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1349a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            BluetoothActivityEnergyInfo bluetoothEnergyInfo = null;
1350a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if ((updateFlags & UPDATE_BT) != 0) {
1351c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                // We only pull bluetooth stats when we have to, as we are not distributing its
1352c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                // use amongst apps and the sampling frequency does not matter.
1353c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski                bluetoothEnergyInfo = pullBluetoothEnergyInfoLocked();
1354c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            }
1355c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski
13564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            synchronized (mStats) {
1357a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                final long elapsedRealtime = SystemClock.elapsedRealtime();
1358a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                final long uptime = SystemClock.uptimeMillis();
13590c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                if (mStats.mRecordAllHistory) {
13600c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                    mStats.addHistoryEventLocked(elapsedRealtime, uptime,
13610c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                            BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, reason, 0);
13620c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                }
136372478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski
1364a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                if ((updateFlags & UPDATE_CPU) != 0) {
1365a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateCpuTimeLocked();
1366a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateKernelWakelocksLocked();
1367a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1368a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1369a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                if ((updateFlags & UPDATE_RADIO) != 0) {
1370a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateMobileRadioStateLocked(elapsedRealtime);
1371a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1372a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1373a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                if ((updateFlags & UPDATE_WIFI) != 0) {
1374a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateWifiStateLocked(wifiEnergyInfo);
1375a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1376a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1377a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                if ((updateFlags & UPDATE_BT) != 0) {
1378a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    mStats.updateBluetoothStateLocked(bluetoothEnergyInfo);
137972478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski                }
13804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
13814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
13824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1384