BatteryStatsService.java revision 674c9bb2ffde84bd177fd44568d9a12b1c16dc6f
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
19010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.annotation.Nullable;
204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo;
213f03496ad97b5f60ab432bca2d17a3e07b4ade47Jaikumar Ganeshimport android.bluetooth.BluetoothAdapter;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
23e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo;
243abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager;
254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.IWifiManager;
264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo;
2791268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
296f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
314b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Looper;
324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Message;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
340068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor;
359ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException;
36010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.os.Parcelable;
37cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
41010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.os.SynchronousResultReceiver;
42e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
43cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
45713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler;
46713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter;
47713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats;
4806f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
4921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo;
50e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
51e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
5261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskiimport android.util.IntArray;
538a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
54bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinskiimport android.util.TimeUtils;
55674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani
564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy;
5732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
58d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
5932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
60e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
61cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
6220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinskiimport com.android.server.ServiceThread;
6332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
68515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
69515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
70515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
71515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
72515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
73713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays;
74e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
75010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport java.util.concurrent.TimeoutException;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
81cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
8268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        implements PowerManagerInternal.LowPowerModeListener,
8368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        BatteryStatsImpl.PlatformIdleStateCallback {
84c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
85c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
86010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    /**
87010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * How long to wait on an individual subsystem to return its stats.
88010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     */
89010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000;
90010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
912078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius    // There is some accuracy error in wifi reports so allow some slop in the results.
922078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius    private static final long MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS = 750;
932078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius
94010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static IBatteryStats sService;
95010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
97010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private final BatteryStatsHandler mHandler;
98010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private Context mContext;
99010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private IWifiManager mWifiManager;
100010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private TelephonyManager mTelephony;
101010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
102010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    // Lock acquired when extracting data from external sources.
103010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private final Object mExternalStatsLock = new Object();
104010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
105010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    // WiFi keeps an accumulated total of stats, unlike Bluetooth.
106010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    // Keep the last WiFi stats so we can compute a delta.
107010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @GuardedBy("mExternalStatsLock")
108010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private WifiActivityEnergyInfo mLastInfo =
109010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            new WifiActivityEnergyInfo(0, 0, 0, new long[]{0}, 0, 0, 0);
1103f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync {
1124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_SYNC_EXTERNAL_STATS = 1;
1134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_WRITE_TO_DISK = 2;
114010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
115a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        private int mUpdateFlags = 0;
11661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private IntArray mUidsToRemove = new IntArray();
1174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public BatteryStatsHandler(Looper looper) {
1194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            super(looper);
1204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
1234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public void handleMessage(Message msg) {
1244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            switch (msg.what) {
1254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_SYNC_EXTERNAL_STATS:
126a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    final int updateFlags;
127a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    synchronized (this) {
128a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        removeMessages(MSG_SYNC_EXTERNAL_STATS);
129a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        updateFlags = mUpdateFlags;
130a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        mUpdateFlags = 0;
131a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    }
132010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    updateExternalStatsSync((String)msg.obj, updateFlags);
13356d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski
13456d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // other parts of the system could be calling into us
13556d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // from mStats in order to report of changes. We must grab the mStats
13656d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // lock before grabbing our own or we'll end up in a deadlock.
13756d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    synchronized (mStats) {
13856d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                        synchronized (this) {
13961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            final int numUidsToRemove = mUidsToRemove.size();
14061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            for (int i = 0; i < numUidsToRemove; i++) {
14161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                                mStats.removeIsolatedUidLocked(mUidsToRemove.get(i));
14261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            }
14361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        }
14461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        mUidsToRemove.clear();
14561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                    }
1464b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1474b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_WRITE_TO_DISK:
149010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    updateExternalStatsSync("write", UPDATE_ALL);
1504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    synchronized (mStats) {
1514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                        mStats.writeAsyncLocked();
1524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    }
1534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
1554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
1589f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        public void scheduleSync(String reason, int updateFlags) {
15961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            synchronized (this) {
1609f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                scheduleSyncLocked(reason, updateFlags);
16161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
162a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        }
163a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
16461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        @Override
16561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        public void scheduleCpuSyncDueToRemovedUid(int uid) {
166a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            synchronized (this) {
16761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                scheduleSyncLocked("remove-uid", UPDATE_CPU);
16861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                mUidsToRemove.add(uid);
16961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
17061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        }
17161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
17261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private void scheduleSyncLocked(String reason, int updateFlags) {
17361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            if (mUpdateFlags == 0) {
17461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason));
1754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
17661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mUpdateFlags |= updateFlags;
1774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
18068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
18168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
18268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .newDecoder()
18368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onMalformedInput(CodingErrorAction.REPLACE)
18468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
18568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .replaceWith("?");
18668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE);
18768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE);
18868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private static final int MAX_LOW_POWER_STATS_SIZE = 512;
18968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
19068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    @Override
19168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    public String getPlatformLowPowerStats() {
19268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        mUtf8BufferStat.clear();
19368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        mUtf16BufferStat.clear();
19468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        mDecoderStat.reset();
19568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat);
19668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        if (bytesWritten < 0) {
19768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan            return null;
19868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        } else if (bytesWritten == 0) {
19968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan            return "Empty";
20068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        }
20168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        mUtf8BufferStat.limit(bytesWritten);
20268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
20368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        mUtf16BufferStat.flip();
20468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        return mUtf16BufferStat.toString();
20568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    }
20668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
2070068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    BatteryStatsService(File systemDir, Handler handler) {
2084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Our handler here will be accessing the disk, use a different thread than
2094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // what the ActivityManagerService gave us (no I/O on that one!).
21020b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        final ServiceThread thread = new ServiceThread("batterystats-sync",
21120b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski                Process.THREAD_PRIORITY_DEFAULT, true);
21220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        thread.start();
21320b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        mHandler = new BatteryStatsHandler(thread.getLooper());
2144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
21668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        mStats = new BatteryStatsImpl(systemDir, handler, mHandler, this);
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
21868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void publish(Context context) {
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
221f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
222f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                com.android.internal.R.integer.config_radioScanningTimeout)
223f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                * 1000L);
224e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        mStats.setPowerProfile(new PowerProfile(context));
2256832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
2262c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
2272c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
2282c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
2292c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
2302c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
2312c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
2322c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
233010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
234010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        powerMgr.registerLowPowerModeObserver(this);
235010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        mStats.notePowerSaveMode(powerMgr.getLowPowerModeEnabled());
236c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
2372c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
2382c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
23955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
2408a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
2414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
242010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        updateExternalStatsSync("shutdown", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
24355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
2446b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
24555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
24620b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski
24720b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        // Shutdown the thread we made.
24820b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        mHandler.getLooper().quit();
24955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
25055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
25591268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
259cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
260cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
261cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void onLowPowerModeChanged(boolean enabled) {
262cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
2638ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePowerSaveMode(enabled);
264cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
265cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
266cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
2814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK);
2824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2834b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2842f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
2852f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
286b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
287b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
288b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
289b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
290b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
291b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
292b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
293b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
294b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
2952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
2962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2972f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
2982f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2992f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
3022f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
30361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
3042f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3052f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3062f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3072f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
3082f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
3092f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
3102f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3112f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3122f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
3141e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3151e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
3161e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3171e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3181e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
3191e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
3201e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3211e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
3221e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3231e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3241e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
325a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteProcessFinish(String name, int uid) {
3262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
327a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
3282f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3292f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3302f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
331a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteUidProcessState(int uid, int state) {
3322f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
333a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteUidProcessStateLocked(uid, state);
3342f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3352f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3362f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3372f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
3382f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
3428a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
3438a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
345010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
3464b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3474b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
3550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
3560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
3570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
3580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
360010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
3614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
3650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
3660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
3670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
3680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
3690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
3700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
3710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
3730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3744870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
3754870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
3764870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
3774870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
3784870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
3794870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
380ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
381ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
382ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
383ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
384ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
385ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
386ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
387ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
388ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
389ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
390ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
391ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
392ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
393ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
394099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
395099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
396099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
397099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
398099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
399099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
400099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
401fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
402fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
403fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
404fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
405fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
406fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
407fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
408fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
409fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
410fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
411fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
412fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
413fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
414fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
415fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
416fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
418fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
419fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
420fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
421fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
422fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobFinish(String name, int uid) {
423fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
424fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
425fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobFinishLocked(name, uid);
426fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
427fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
428fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
4291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
4301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
4321e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
4331e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4341e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4351e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
4361e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
4371e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4381e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
4391e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
4401e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4411e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4421e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
443a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
4443d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
447e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
44840c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
452cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
455cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
456cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
460a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
461a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
4627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
464a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
465a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
4667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
469cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
470cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
471e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
472e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
473e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
474cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
475e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
476e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
477e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
478e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
479cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
480cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
4817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
483cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
4847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
487d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockStart(String name, String historyName, int uid) {
488d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
489d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
490d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockStart(name, historyName, uid);
491d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
492d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
493d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
494d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockFinish(String name, String historyName, int uid) {
495d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
496d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
497d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockFinish(name, historyName, uid);
498d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
499d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
500d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5119adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
515a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
516a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
517a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
518a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
519a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
520a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
521a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
522a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
523a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
524a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
525a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
526a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
527a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
528a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5396b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
543e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
546e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
550617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
551617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
552617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
553617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
554617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
555617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
556617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
557e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
560e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
563617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
564280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
565280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
566280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
567280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
568280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
569280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
570280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
571e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
573617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
574e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
575617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
576617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
577e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5781e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
5791e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
5801e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
5811e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
5821e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
5831e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
5841e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
585fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi    public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
586e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
587e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
588fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi            mStats.noteMobileRadioPowerState(powerState, timestampNs, uid);
589e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
590e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
591e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
605105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
606e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
607627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
608627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
609e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
610627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
611627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
612627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
613627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
614627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
615627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
616627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
61932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
620f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
62132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
622e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
62332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
624e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
62532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
62632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
62732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
62858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
629105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
630105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
63158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
632105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
634105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
63558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
636105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
637105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
63858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
640105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
641d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
642244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
643244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
644244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
650244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
651244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
652244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
653244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
654244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
655244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
656244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
657244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
658244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
659244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
660244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
661244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
662244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
663244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
664244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
665244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
666244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
667244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
668244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
669244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
67010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
67110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
67210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
67310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
67410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
67510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
67610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
67710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
67810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
67910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
68010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
68110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
68210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
68310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
6846d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
685abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
686abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6876d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
688abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
689abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
690abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
6916d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
692abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
693abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6946d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
6956d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6966d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6976d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6986d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
6996d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7006d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7016d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
7026d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7036d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7046d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7056d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
7066d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7076d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7086d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
7096d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7106d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7116d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7126d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
7136d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7146d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7156d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
7166d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7176d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7186d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7196d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
7206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
723abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
724abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
725abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
726e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
7275f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) {
728e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
729e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
730e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
731e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
7320c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
733a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
73406f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
73506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
73606f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
7379f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                mHandler.scheduleSync("wifi-data: " + type,
7389f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                        BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI);
739a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
7405f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski            mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
7410c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
742e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
743e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
74458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
745d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
746d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
74758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
748d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
749d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
750d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
75158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
752d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
753d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
75458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
75558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
75658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
75758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
75858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
75958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
76058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
76158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
762d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
763d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
764d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
765ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
766ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
767ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
768ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
769ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
770ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
771ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
7723251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
7733251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7743251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7753251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
7763251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7773251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7783251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7793251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
7803251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7813251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7823251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
7833251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7843251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7853251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
786105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
787105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
788105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
789105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
793105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
794105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
796105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
797105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
798105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7996ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8006ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
801105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
802105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8036ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
804105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
805105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8066ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8076ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8106ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
811105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8145347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
8155347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
8185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
8225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
8255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
8297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
8327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
8367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
8397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8426ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
8437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8456ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
8467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8496ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
8507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8526ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
8537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
856a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
857a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
858a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
859a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
860a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
861a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
862a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
863a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
864a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
865a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
866a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
867a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
868a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
869a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
8707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
8717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
8747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
8787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
8797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
8827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8857a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8864b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
8871059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
8881059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
8894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
8901059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
8911059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
8921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
8937a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8947a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
8957a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
8967a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        synchronized (mStats) {
8977a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey            mStats.noteNetworkStatsEnabledLocked();
8987a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        }
8997a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
9007a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
9018ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
90208c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
9038ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9048ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
90508c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
9068ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9078ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9088ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9098ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
9108ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9118ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9128ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
9138ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9148ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9158ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9168ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
9178ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9188ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9198ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
9208ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9218ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9228ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9236771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
9246771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    public void noteBleScanStarted(WorkSource ws) {
9256771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9269f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9279f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteBluetoothScanStartedFromSourceLocked(ws);
9289f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9296771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9306771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
9316771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
9326771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    public void noteBleScanStopped(WorkSource ws) {
9336771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9349f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9359f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteBluetoothScanStoppedFromSourceLocked(ws);
9369f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9379f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
9389f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
9399f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    @Override
9409f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public void noteResetBleScan() {
9419f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        enforceCallingPermission();
9429f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9439f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteResetBluetoothScanLocked();
9449f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9456771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9466771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
947010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
948010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteWifiControllerActivity(WifiActivityEnergyInfo info) {
949010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
950010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
951010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
952010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid wifi data given: " + info);
953010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
954010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
955010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
956010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        synchronized (mStats) {
957010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            mStats.updateWifiStateLocked(info);
958010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
959010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
960010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
961010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
962010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) {
963010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
964010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
965010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid bluetooth data given: " + info);
966010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
967010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
968010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
969010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        synchronized (mStats) {
970010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            mStats.updateBluetoothStateLocked(info);
971010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
972010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
973010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
974010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
975010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteModemControllerActivity(ModemActivityInfo info) {
976010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
977010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
978010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
979010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid modem data given: " + info);
980010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
981010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
982010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
983010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        synchronized (mStats) {
984010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), info);
985010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
986010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
987010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
992d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
993d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
994041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int level, final int temp, final int volt, final int chargeUAh,
995041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int chargeFullUAh) {
996d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
997d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
998d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
999d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
1000d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        mHandler.post(new Runnable() {
1001d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            @Override
1002d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            public void run() {
1003d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
1004d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
1005d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    if (mStats.isOnBattery() == onBattery) {
1006d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        // The battery state has not changed, so we don't need to sync external
1007d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        // stats immediately.
1008926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski                        mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1009041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski                                chargeUAh, chargeFullUAh);
1010d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                        return;
1011d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    }
1012d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1013d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1014d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // Sync external stats first as the battery has changed states. If we don't sync
1015d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // immediately here, we may not collect the relevant data later.
1016010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                updateExternalStatsSync("battery-state", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
1017d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
1018926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1019041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski                            chargeUAh, chargeFullUAh);
1020d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1021d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            }
1022d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
1023633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
1024633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1044c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1045c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
1046515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
1047515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
1048515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
1049515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
1050c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1051c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
1052c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
1053c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1054c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1055c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
1056c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
1057c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1058515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
1059515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
1060515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
1061515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
1062515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
1063515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1064515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
1065515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
1066515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1067c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
1068515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
1069515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
1070c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
1071515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
1072c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1073c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
1074c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
1075c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
1076c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
1077c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1078515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1079515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
1080515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
1081515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
1082515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
1083515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1084515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
1085515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
1086515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
1087515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
1088515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
1089515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
1090515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1091515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
1092515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
1093515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1094515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
1095515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
1096515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
1097515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
1098515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1099515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
1100515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
1101515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
1102c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1103c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1104515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
1105c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1106ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
110791268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
11081e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
1109d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
1110865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
1111865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
11121476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato        pw.println("  -c: write the current stats in checkin format.");
1113099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
1114c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
1115c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
1116d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
1117ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
1118ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
1119d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
1120d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
1121cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
1122fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
1123fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
1124fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
1125fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
1126fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
11270068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
11281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
1129fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
1130674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        pw.println("      pretend-screen-off: pretend the screen is off, even if screen state changes");
1131ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1132ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1133cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1134cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1135cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1136cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1137cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1138cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1139cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
11400068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1141cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
11420068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1143cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
11449a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
11459a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
11469a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
11479a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1148674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        } else if ("pretend-screen-off".equals(args[i])) {
1149674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            synchronized (mStats) {
1150674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani                mStats.setPretendScreenOff(enable);
1151674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            }
1152cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1153cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1154cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1155cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1156cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1157cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1158cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1159cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
11604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
11633abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
11643abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                != PackageManager.PERMISSION_GRANTED) {
11653abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            pw.println("Permission Denial: can't dump BatteryStats from from pid="
11663abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
11673abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + " without permission " + android.Manifest.permission.DUMP);
11683abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            return;
11693abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        }
11703abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1171c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
11720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
11730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
11740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
117516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
1176c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
1177cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
1178e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
1179c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
1180c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
1181e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
11820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
11830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
1184099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
1185c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1186c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
1187c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1188c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
1189c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
1190c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
1191c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
1192c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
1193c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1194c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
119516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
119649021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
11970068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
1198c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
1199c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1200c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1201d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1202d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1203e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1204e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
12053d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1206e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
12070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1209010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
12100ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
1211010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
12120ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
12130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
12140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
12150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1217d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1218d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1219d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1220d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1221d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1222d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1223d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1224d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1225d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1226d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1227d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1228d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1229fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1230cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1231cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1232cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1233cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1234cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1235cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1236fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1237cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1238cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1239cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1240cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1241cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1242cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1243ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1244ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1245ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1246e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1247a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1248cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
12490ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1250ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1251cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1252cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1253cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1254cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1255e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey                        reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
1256cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1257cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1258cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1259cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1260cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1261cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1264e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
12650ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
12660ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
126813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
126913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
127013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
127113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
127213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
127313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
127413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
1275010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
127613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
127713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1278d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
127913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1280ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1281ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1282ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
12831e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1284ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1285ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1286ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1287ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1288ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
12894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12900068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (useCheckinFormat) {
12919cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
12920d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
12930068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
12940068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
12950068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
12960068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
12970068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
12980068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
12990068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
13000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
13010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
13020068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
13030068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
13040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
13054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                                        null, mStats.mHandler, null);
13060068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
13070068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
13080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
13090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
13100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
13110068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
13120068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
13139ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
13140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
13150068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
13160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
13170068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
13180068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
13190068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
1320e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1321c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
132216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
132316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
132416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1325e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1326e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
1327e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1328c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
132916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
133016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
133116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1332e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1336010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private WifiActivityEnergyInfo extractDelta(WifiActivityEnergyInfo latest) {
1337010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long timePeriodMs = latest.mTimestamp - mLastInfo.mTimestamp;
1338010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long lastIdleMs = mLastInfo.mControllerIdleTimeMs;
1339010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long lastTxMs = mLastInfo.mControllerTxTimeMs;
1340010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long lastRxMs = mLastInfo.mControllerRxTimeMs;
1341010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long lastEnergy = mLastInfo.mControllerEnergyUsed;
1342010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1343010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        // We will modify the last info object to be the delta, and store the new
1344010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        // WifiActivityEnergyInfo object as our last one.
1345010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final WifiActivityEnergyInfo delta = mLastInfo;
1346010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        delta.mTimestamp = latest.getTimeStamp();
1347010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        delta.mStackState = latest.getStackState();
1348010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1349684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs;
1350684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs;
1351684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs;
1352684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius
1353684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        if (txTimeMs < 0 || rxTimeMs < 0) {
1354010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            // The stats were reset by the WiFi system (which is why our delta is negative).
1355010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            // Returns the unaltered stats.
1356010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            delta.mControllerEnergyUsed = latest.mControllerEnergyUsed;
1357010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            delta.mControllerRxTimeMs = latest.mControllerRxTimeMs;
1358010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            delta.mControllerTxTimeMs = latest.mControllerTxTimeMs;
1359010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs;
1360010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta);
1361684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        } else {
1362684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            final long totalActiveTimeMs = txTimeMs + rxTimeMs;
1363684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            long maxExpectedIdleTimeMs;
1364684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            if (totalActiveTimeMs > timePeriodMs) {
13652078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                // Cap the max idle time at zero since the active time consumed the whole time
13662078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                maxExpectedIdleTimeMs = 0;
13672078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                if (totalActiveTimeMs > timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) {
13682078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    StringBuilder sb = new StringBuilder();
13692078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append("Total Active time ");
13702078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(totalActiveTimeMs, sb);
13712078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" is longer than sample period ");
13722078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(timePeriodMs, sb);
13732078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(".\n");
13742078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append("Previous WiFi snapshot: ").append("idle=");
13752078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(lastIdleMs, sb);
13762078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" rx=");
13772078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(lastRxMs, sb);
13782078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" tx=");
13792078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(lastTxMs, sb);
13802078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" e=").append(lastEnergy);
13812078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append("\n");
13822078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append("Current WiFi snapshot: ").append("idle=");
13832078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb);
13842078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" rx=");
13852078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb);
13862078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" tx=");
13872078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb);
13882078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" e=").append(latest.mControllerEnergyUsed);
13892078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    Slog.wtf(TAG, sb.toString());
13902078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                }
1391684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            } else {
1392684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius                maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs;
1393684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            }
1394684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // These times seem to be the most reliable.
1395684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            delta.mControllerTxTimeMs = txTimeMs;
1396684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            delta.mControllerRxTimeMs = rxTimeMs;
1397684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // WiFi calculates the idle time as a difference from the on time and the various
1398684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // Rx + Tx times. There seems to be some missing time there because this sometimes
1399684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // becomes negative. Just cap it at 0 and ensure that it is less than the expected idle
1400684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // time from the difference in timestamps.
1401684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // b/21613534
1402684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            delta.mControllerIdleTimeMs = Math.min(maxExpectedIdleTimeMs, Math.max(0, idleTimeMs));
1403684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy);
1404010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
1405010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1406010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        mLastInfo = latest;
1407010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        return delta;
14084b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
14094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1410010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    /**
1411010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * Helper method to extract the Parcelable controller info from a
1412010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * SynchronousResultReceiver.
1413010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     */
1414010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static <T extends Parcelable> T awaitControllerInfo(
1415010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            @Nullable SynchronousResultReceiver receiver) throws TimeoutException {
1416010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (receiver == null) {
1417010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return null;
14184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
14194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1420010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final SynchronousResultReceiver.Result result =
1421010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                receiver.awaitResult(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS);
1422010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (result.bundle != null) {
1423010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            // This is the final destination for the Bundle.
1424010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            result.bundle.setDefusable(true);
1425010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1426010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            final T data = result.bundle.getParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY);
1427010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            if (data != null) {
1428010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                return data;
142921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            }
143021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        }
1431010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        Slog.e(TAG, "no controller energy info supplied");
143221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        return null;
143321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski    }
143421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski
14354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
14364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates
14374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * batterystats with that information.
14384b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     *
14394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * We first grab a lock specific to this method, then once all the data has been collected,
14404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * we grab the mStats lock and update the data.
1441c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     *
1442c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * @param reason The reason why this collection was requested. Useful for debugging.
1443a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski     * @param updateFlags Which external stats to update. Can be a combination of
14449f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_CPU},
14459f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_RADIO},
14469f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_WIFI},
14479f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    and {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_BT}.
14484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
1449010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    void updateExternalStatsSync(final String reason, int updateFlags) {
1450010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        SynchronousResultReceiver wifiReceiver = null;
1451010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        SynchronousResultReceiver bluetoothReceiver = null;
1452010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        SynchronousResultReceiver modemReceiver = null;
1453010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
14544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mExternalStatsLock) {
1455e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            if (mContext == null) {
1456010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                // Don't do any work yet.
1457e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                return;
1458e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            }
1459e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
14609f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) {
1461010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (mWifiManager == null) {
1462010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    mWifiManager = IWifiManager.Stub.asInterface(
1463010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                            ServiceManager.getService(Context.WIFI_SERVICE));
1464010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                }
1465a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1466010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (mWifiManager != null) {
1467010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    try {
1468010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        wifiReceiver = new SynchronousResultReceiver();
1469010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        mWifiManager.requestActivityInfo(wifiReceiver);
1470010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    } catch (RemoteException e) {
1471010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        // Oh well.
1472010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    }
1473010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                }
147421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            }
147521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski
14769f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) {
1477010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
1478010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (adapter != null) {
1479010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    bluetoothReceiver = new SynchronousResultReceiver();
1480991357fe25b3addabf85b871df3f4098fc4b833bAdam Lesinski                    adapter.requestControllerActivityEnergyInfo(bluetoothReceiver);
1481010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                }
1482c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            }
1483c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski
1484010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) {
1485010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (mTelephony == null) {
1486010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    mTelephony = TelephonyManager.from(mContext);
14870c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                }
148872478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski
1489010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (mTelephony != null) {
1490010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    modemReceiver = new SynchronousResultReceiver();
1491010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    mTelephony.requestModemActivityInfo(modemReceiver);
1492a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1493010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            }
1494a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1495010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            WifiActivityEnergyInfo wifiInfo = null;
1496010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            BluetoothActivityEnergyInfo bluetoothInfo = null;
1497010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            ModemActivityInfo modemInfo = null;
1498010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            try {
1499010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                wifiInfo = awaitControllerInfo(wifiReceiver);
1500010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            } catch (TimeoutException e) {
1501010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                Slog.w(TAG, "Timeout reading wifi stats");
1502010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            }
1503010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1504010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            try {
1505010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                bluetoothInfo = awaitControllerInfo(bluetoothReceiver);
1506010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            } catch (TimeoutException e) {
1507010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                Slog.w(TAG, "Timeout reading bt stats");
1508010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            }
1509010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1510010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            try {
1511010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                modemInfo = awaitControllerInfo(modemReceiver);
1512010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            } catch (TimeoutException e) {
1513010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                Slog.w(TAG, "Timeout reading modem stats");
1514010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            }
1515010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1516010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            synchronized (mStats) {
1517010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                mStats.addHistoryEventLocked(
1518010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        SystemClock.elapsedRealtime(),
1519010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        SystemClock.uptimeMillis(),
1520010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS,
1521010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        reason, 0);
1522010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1523010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                mStats.updateCpuTimeLocked();
1524010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                mStats.updateKernelWakelocksLocked();
15252dd7e5e3ef0a20864a5908fd8c0896776575d68aJames Carr                mStats.updateKernelMemoryBandwidthLocked();
1526010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1527010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (wifiInfo != null) {
1528010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    if (wifiInfo.isValid()) {
1529010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        mStats.updateWifiStateLocked(extractDelta(wifiInfo));
1530010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    } else {
1531010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        Slog.e(TAG, "wifi info is invalid: " + wifiInfo);
1532010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    }
1533a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1534a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1535010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (bluetoothInfo != null) {
1536010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    if (bluetoothInfo.isValid()) {
1537010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        mStats.updateBluetoothStateLocked(bluetoothInfo);
1538010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    } else {
1539010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo);
1540010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    }
1541a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1542a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1543010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (modemInfo != null) {
1544010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    if (modemInfo.isValid()) {
1545010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(),
1546010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                                modemInfo);
1547010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    } else {
1548010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        Slog.e(TAG, "modem info is invalid: " + modemInfo);
1549010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    }
155072478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski                }
15514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
15524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
15534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1554713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1555713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1556713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a particular uid.
1557713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1558713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1559713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler takeUidSnapshot(int requestUid) {
1560713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (requestUid != Binder.getCallingUid()) {
1561713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1562713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1563713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1564713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1565713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1566010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            updateExternalStatsSync("get-health-stats-for-uid",
1567713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
1568713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1569713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return getHealthStatsForUidLocked(requestUid);
1570713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1571713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
1572713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Slog.d(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
1573713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1574713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1575713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1576713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1577713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1578713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1579713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1580713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a number of uids.
1581713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1582713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1583713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) {
1584713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (!onlyCaller(requestUids)) {
1585713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1586713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1587713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1588713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1589713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        int i=-1;
1590713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1591010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            updateExternalStatsSync("get-health-stats-for-uids",
1592713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
1593713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1594713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final int N = requestUids.length;
1595713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final HealthStatsParceler[] results = new HealthStatsParceler[N];
1596713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                for (i=0; i<N; i++) {
1597713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    results[i] = getHealthStatsForUidLocked(requestUids[i]);
1598713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                }
1599713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return results;
1600713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1601713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
1602713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
1603713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    + Arrays.toString(requestUids) + ") i=" + i, ex);
1604713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1605713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1606713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1607713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1608713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1609713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1610713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1611713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Returns whether the Binder.getCallingUid is the only thing in requestUids.
1612713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1613713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    private static boolean onlyCaller(int[] requestUids) {
1614713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int caller = Binder.getCallingUid();
1615713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int N = requestUids.length;
1616713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        for (int i=0; i<N; i++) {
1617713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            if (requestUids[i] != caller) {
1618713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return false;
1619713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1620713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1621713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return true;
1622713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1623713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1624713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1625713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a HealthStatsParceler for the given uid. You should probably call
1626010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * updateExternalStatsSync first.
1627713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1628713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    HealthStatsParceler getHealthStatsForUidLocked(int requestUid) {
1629713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter();
1630713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS);
1631713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid);
1632713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (uid != null) {
1633713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            writer.writeUid(uidWriter, mStats, uid);
1634713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1635713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return new HealthStatsParceler(uidWriter);
1636713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1637713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1639