BatteryStatsService.java revision cd722084fb8c127e1798948fdad79b53a37a239c
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;
27455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.os.PowerSaveState;
2891268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
306f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Looper;
334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.Message;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
350068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor;
369ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException;
37010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.os.Parcelable;
38cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.os.RemoteException;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
42010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport android.os.SynchronousResultReceiver;
43e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
44cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
46713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler;
47713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter;
48713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats;
4906f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
5021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo;
51e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
52e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
5361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinskiimport android.util.IntArray;
548a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
55bd6704fc4de980ae149c54775aaab9cbc3205f6bAdam Lesinskiimport android.util.TimeUtils;
56674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani
574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport com.android.internal.annotations.GuardedBy;
5832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
59d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
6032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
61e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
62cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
6320b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinskiimport com.android.server.ServiceThread;
64455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport com.android.server.power.BatterySaverPolicy.ServiceType;
6532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
70515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
71515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
72515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
73515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
74515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
75713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays;
76e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
77010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinskiimport java.util.concurrent.TimeoutException;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
83cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
8468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        implements PowerManagerInternal.LowPowerModeListener,
8568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        BatteryStatsImpl.PlatformIdleStateCallback {
86c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
87c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
88010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    /**
89010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * How long to wait on an individual subsystem to return its stats.
90010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     */
91010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static final long EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS = 2000;
92010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
932078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius    // There is some accuracy error in wifi reports so allow some slop in the results.
942078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius    private static final long MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS = 750;
952078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius
96010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static IBatteryStats sService;
97010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
99010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private final BatteryStatsHandler mHandler;
100010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private Context mContext;
101010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private IWifiManager mWifiManager;
102010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private TelephonyManager mTelephony;
103010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
104010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    // Lock acquired when extracting data from external sources.
105010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private final Object mExternalStatsLock = new Object();
106010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
107010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    // WiFi keeps an accumulated total of stats, unlike Bluetooth.
108010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    // Keep the last WiFi stats so we can compute a delta.
109010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @GuardedBy("mExternalStatsLock")
110010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private WifiActivityEnergyInfo mLastInfo =
111010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            new WifiActivityEnergyInfo(0, 0, 0, new long[]{0}, 0, 0, 0);
1123f7e35c2c7d3d7f08f50c1d93cd16b1f49354cccAmith Yamasani
1134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    class BatteryStatsHandler extends Handler implements BatteryStatsImpl.ExternalStatsSync {
1144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_SYNC_EXTERNAL_STATS = 1;
1154b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public static final int MSG_WRITE_TO_DISK = 2;
116010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
117a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        private int mUpdateFlags = 0;
11861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private IntArray mUidsToRemove = new IntArray();
1194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public BatteryStatsHandler(Looper looper) {
1214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            super(looper);
1224b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
1254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        public void handleMessage(Message msg) {
1264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            switch (msg.what) {
1274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_SYNC_EXTERNAL_STATS:
128a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    final int updateFlags;
129a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    synchronized (this) {
130a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        removeMessages(MSG_SYNC_EXTERNAL_STATS);
131a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        updateFlags = mUpdateFlags;
132a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                        mUpdateFlags = 0;
133a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                    }
134010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    updateExternalStatsSync((String)msg.obj, updateFlags);
13556d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski
13656d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // other parts of the system could be calling into us
13756d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // from mStats in order to report of changes. We must grab the mStats
13856d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    // lock before grabbing our own or we'll end up in a deadlock.
13956d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                    synchronized (mStats) {
14056d82dd28a3c7dcca9c9dc37a73a1cf5fc44498eAdam Lesinski                        synchronized (this) {
14161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            final int numUidsToRemove = mUidsToRemove.size();
14261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            for (int i = 0; i < numUidsToRemove; i++) {
14361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                                mStats.removeIsolatedUidLocked(mUidsToRemove.get(i));
14461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                            }
14561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        }
14661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                        mUidsToRemove.clear();
14761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                    }
1484b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1494b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                case MSG_WRITE_TO_DISK:
151010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    updateExternalStatsSync("write", UPDATE_ALL);
152cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                    Slog.d(TAG, "begin writeAsyncLocked");
1534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    synchronized (mStats) {
1544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                        mStats.writeAsyncLocked();
1554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    }
156cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                    Slog.d(TAG, "end writeAsyncLocked");
1574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                    break;
1584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
1594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        @Override
1629f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        public void scheduleSync(String reason, int updateFlags) {
16361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            synchronized (this) {
1649f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                scheduleSyncLocked(reason, updateFlags);
16561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
166a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski        }
167a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
16861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        @Override
16961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        public void scheduleCpuSyncDueToRemovedUid(int uid) {
170a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            synchronized (this) {
17161db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                scheduleSyncLocked("remove-uid", UPDATE_CPU);
17261db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                mUidsToRemove.add(uid);
17361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            }
17461db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        }
17561db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski
17661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski        private void scheduleSyncLocked(String reason, int updateFlags) {
17761db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            if (mUpdateFlags == 0) {
17861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski                sendMessage(Message.obtain(this, MSG_SYNC_EXTERNAL_STATS, reason));
1794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
18061db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mUpdateFlags |= updateFlags;
1814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1824b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1834b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
18468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
18568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
18668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .newDecoder()
18768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onMalformedInput(CodingErrorAction.REPLACE)
18868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
18968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .replaceWith("?");
19068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE);
19168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE);
19268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private static final int MAX_LOW_POWER_STATS_SIZE = 512;
19368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
19468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    @Override
19568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    public String getPlatformLowPowerStats() {
196cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        Slog.d(TAG, "begin getPlatformLowPowerStats");
197cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        try {
198cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.clear();
199cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.clear();
200cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.reset();
201cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat);
202cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            if (bytesWritten < 0) {
203cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return null;
204cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            } else if (bytesWritten == 0) {
205cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return "Empty";
206cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            }
207cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.limit(bytesWritten);
208cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
209cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.flip();
210cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            return mUtf16BufferStat.toString();
211cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        } finally {
212cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            Slog.d(TAG, "end getPlatformLowPowerStats");
21368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        }
21468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    }
21568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
2160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    BatteryStatsService(File systemDir, Handler handler) {
2174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // Our handler here will be accessing the disk, use a different thread than
2184b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // what the ActivityManagerService gave us (no I/O on that one!).
21920b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        final ServiceThread thread = new ServiceThread("batterystats-sync",
22020b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski                Process.THREAD_PRIORITY_DEFAULT, true);
22120b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        thread.start();
22220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        mHandler = new BatteryStatsHandler(thread.getLooper());
2234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2244b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
22568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        mStats = new BatteryStatsImpl(systemDir, handler, mHandler, this);
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
22768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void publish(Context context) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext = context;
230f37447bad3773b62176baa837908daf6edb44273Amith Yamasani        mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
231f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                com.android.internal.R.integer.config_radioScanningTimeout)
232f37447bad3773b62176baa837908daf6edb44273Amith Yamasani                * 1000L);
233e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        mStats.setPowerProfile(new PowerProfile(context));
2346832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
2352c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
2362c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
2372c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
2382c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
2392c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
2402c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
2412c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
242010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
243010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        powerMgr.registerLowPowerModeObserver(this);
244455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei        mStats.notePowerSaveMode(
245455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
246455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei                        .batterySaverEnabled);
247c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
2482c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
2492c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
25055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
2518a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
2524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
253010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        updateExternalStatsSync("shutdown", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
25455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
2556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
25655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
25720b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski
25820b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        // Shutdown the thread we made.
25920b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        mHandler.getLooper().quit();
26055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
26155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
270cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
271cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
272455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public int getServiceType() {
273455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei        return ServiceType.BATTERY_STATS;
274455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
275455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
276455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    @Override
277455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public void onLowPowerModeChanged(PowerSaveState result) {
278cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
279455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei            mStats.notePowerSaveMode(result.batterySaverEnabled);
280cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
281cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
282cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2910068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2924b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
2974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        mHandler.sendEmptyMessage(BatteryStatsHandler.MSG_WRITE_TO_DISK);
2984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
3002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
302b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
303b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
304b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
305b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
306b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
307b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
308b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
309b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
310b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
3112f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
3122f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
3132f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
3142f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3152f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3162f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3172f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
3182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
31961db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
3202f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3212f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3222f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
3242f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
3252f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
3262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3282f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3291e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
3301e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3311e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
3321e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3331e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3341e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
3351e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
3361e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3371e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
3381e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3391e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3401e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
341a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteProcessFinish(String name, int uid) {
3422f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
343a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
3442f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3452f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3462f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
347a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteUidProcessState(int uid, int state) {
3482f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
349a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteUidProcessStateLocked(uid, state);
3502f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3512f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3522f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3532f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
3542f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
3588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
3598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
361010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
3624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
3710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
3720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
3730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
3740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
376010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        updateExternalStatsSync("get-stats", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
3774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
3810068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
3820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
3830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
3840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
3850068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
3860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
3870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3880068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
3890068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3904870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
3914870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
3924870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
3934870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
3944870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
3954870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
396ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
397ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
398ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
399ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
400ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
401ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
402ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
403ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
404ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
405ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
406ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
407ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
408ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
409ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
410099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
411099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
412099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
413099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
414099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
415099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
416099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
418fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
419fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
420fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
421fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
422fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
423fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
424fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
425fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
426fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
427fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
428fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
429fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
430fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
431fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
432fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
433fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
434fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
435fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
436fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
437fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
438fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobFinish(String name, int uid) {
439fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
440fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
441fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobFinishLocked(name, uid);
442fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
443fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
444fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
4451e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
4461e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4471e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
4481e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
4491e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4501e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4511e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
4521e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
4531e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4541e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
4551e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
4561e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4571e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4581e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
459a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
4603d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
463e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
46440c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
468cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
471cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
472cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
476a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
477a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
4787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
480a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
481a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
4827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
485cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
486cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
487e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
488e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
489e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
490cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
491e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
492e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
493e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
494e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
495cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
496cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
4977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
499cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
5007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
5017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
5027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
503d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockStart(String name, String historyName, int uid) {
504d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
505d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
506d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockStart(name, historyName, uid);
507d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
508d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
509d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
510d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockFinish(String name, String historyName, int uid) {
511d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
512d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
513d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockFinish(name, historyName, uid);
514d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
515d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
516d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
531a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
532a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
533a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
534a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
535a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
536a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
537a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
538a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
539a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
540a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
541a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
542a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
543a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
544a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
559e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
561cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        Slog.d(TAG, "begin noteScreenState");
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
563e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
565cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        Slog.d(TAG, "end noteScreenState");
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
568617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
569617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
570617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
573617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
574617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
575e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
578e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
581617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
582280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
583280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
584280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
585280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
586280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
587280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
588280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
589e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
590617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
591617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
592e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
593617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
595e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5961e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
5971e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
5981e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
5991e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
6001e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
6011e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
6021e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
603fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi    public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
604e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
605e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
606fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi            mStats.noteMobileRadioPowerState(powerState, timestampNs, uid);
607e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
608e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
609e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
623105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
624e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
625627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
626627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
627e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
628627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
629627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
630627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
631627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
632627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
633627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
634627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
635627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
636627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
63732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
638f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
63932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
640e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
64132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
642e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
64332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
64432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
64532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
64658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
647105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
648105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
64958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
650105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
651105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
652105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
65358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
654105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
655105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
65658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
657105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
658105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
659d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
660244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
661244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
662244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
663244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
664244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
665244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
666244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
667244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
668244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
669244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
670244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
671244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
672244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
673244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
674244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
675244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
676244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
677244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
678244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
679244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
680244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
681244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
682244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
683244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
684244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
685244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
686244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
687244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
68810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
68910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
69010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
69110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
69210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
69310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
69410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
69510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
69610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
69710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
69810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
69910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
70010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
70110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
7026d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
703abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
704abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
7056d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
706abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
707abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
708abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
7096d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
710abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
711abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
7126d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
7136d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7146d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7156d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7166d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
7176d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
718cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        Slog.d(TAG, "begin noteStartCamera");
7196d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
7216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
722cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        Slog.d(TAG, "end noteStartCamera");
7236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7246d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
7266d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7276d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7286d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
7296d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7306d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7316d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7326d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
7336d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7346d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7356d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
7366d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7376d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7386d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7396d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
7406d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7416d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7426d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
743abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
744abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
745abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
746e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
7475f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) {
748e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
749e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
750e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
751e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
7520c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
753a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
75406f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
75506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
75606f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
7579f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                mHandler.scheduleSync("wifi-data: " + type,
7589f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski                        BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI);
759a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
7605f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski            mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
7610c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
762e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
763e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
76458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
765d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
766d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
76758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
768d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
769d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
770d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
77158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
772d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
773d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
77458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
77558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
77658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
77758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
77858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
77958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
78058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
78158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
782d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
783d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
784d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
785ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
786ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
787ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
788ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
789ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
790ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
791ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
7923251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
7933251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7943251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7953251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
7963251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7973251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7983251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7993251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
8003251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
8013251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
8023251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
8033251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
8043251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
8053251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
806105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
807105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
810105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
811105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
813105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
815105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
818105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8196ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8206ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
821105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
822105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8236ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
824105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
825105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8266ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8276ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
828105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
829105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8306ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
831105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
832105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
8355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8365347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
8385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
8425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
8455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
8497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
8527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
8567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
8597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8626ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
8637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8656ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
8667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8696ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
8707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8726ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
8737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
876a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
877a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
878a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
879a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
880a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
881a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
882a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
883a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
884a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
885a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
886a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
887a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
888a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
889a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
8907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
8917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
8947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
8987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
8997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
9007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
9017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
9027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
9037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
9047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
9057a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
9064b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
9071059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
9081059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
9094b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
9101059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
9111059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
9121059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
9137a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
9147a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
9157a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
9167a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        synchronized (mStats) {
9177a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey            mStats.noteNetworkStatsEnabledLocked();
9187a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        }
9197a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
9207a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
9218ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
92208c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
9238ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9248ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
92508c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
9268ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9278ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9288ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9298ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
9308ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9318ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9328ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
9338ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9348ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9358ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9368ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
9378ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9388ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9398ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
9408ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9418ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9428ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9436771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
9446771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    public void noteBleScanStarted(WorkSource ws) {
9456771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9469f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9479f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteBluetoothScanStartedFromSourceLocked(ws);
9489f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9496771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9506771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
9516771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
9526771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    public void noteBleScanStopped(WorkSource ws) {
9536771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9549f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9559f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteBluetoothScanStoppedFromSourceLocked(ws);
9569f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9579f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
9589f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
9599f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    @Override
9609f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public void noteResetBleScan() {
9619f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        enforceCallingPermission();
9629f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9639f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteResetBluetoothScanLocked();
9649f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9656771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9666771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
967010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
968010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteWifiControllerActivity(WifiActivityEnergyInfo info) {
969010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
970010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
971010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
972010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid wifi data given: " + info);
973010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
974010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
975010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
976010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        synchronized (mStats) {
977010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            mStats.updateWifiStateLocked(info);
978010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
979010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
980010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
981010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
982010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) {
983010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
984010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
985010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid bluetooth data given: " + info);
986010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
987010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
988010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
989010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        synchronized (mStats) {
990010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            mStats.updateBluetoothStateLocked(info);
991010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
992010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
993010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
994010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
995010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteModemControllerActivity(ModemActivityInfo info) {
996010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
997010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
998010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
999010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid modem data given: " + info);
1000010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
1001010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
1002010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1003010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        synchronized (mStats) {
1004010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), info);
1005010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
1006010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
1007010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1012d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
1013d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
1014041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int level, final int temp, final int volt, final int chargeUAh,
1015041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int chargeFullUAh) {
1016d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
1017d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1018d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
1019d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
1020d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        mHandler.post(new Runnable() {
1021d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            @Override
1022d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            public void run() {
1023cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                Slog.d(TAG, "begin setBatteryStateLocked");
1024cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                try {
1025cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                    synchronized (mStats) {
1026cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                        final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
1027cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                        if (mStats.isOnBattery() == onBattery) {
1028cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                            // The battery state has not changed, so we don't need to sync external
1029cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                            // stats immediately.
1030cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                            mStats.setBatteryStateLocked(status, health, plugType, level, temp,
1031cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                                    volt,
1032cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                                    chargeUAh, chargeFullUAh);
1033cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                            return;
1034cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                        }
1035d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                    }
1036cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                } finally {
1037cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                    Slog.d(TAG, "end setBatteryStateLocked");
1038d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1039d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1040d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // Sync external stats first as the battery has changed states. If we don't sync
1041d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                // immediately here, we may not collect the relevant data later.
1042010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                updateExternalStatsSync("battery-state", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
1043cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                Slog.d(TAG, "begin setBatteryStateLocked");
1044d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
1045926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1046041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski                            chargeUAh, chargeFullUAh);
1047d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1048cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                Slog.d(TAG, "end setBatteryStateLocked");
1049d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski            }
1050d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
1051633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
1052633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1072c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1073c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
1074515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
1075515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
1076515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
1077515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
1078c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1079c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
1080c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
1081c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1082c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1083c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
1084c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
1085c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1086515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
1087515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
1088515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
1089515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
1090515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
1091515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1092515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
1093515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
1094515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1095c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
1096515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
1097515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
1098c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
1099515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
1100c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1101c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
1102c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
1103c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
1104c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
1105c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1106515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1107515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
1108515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
1109515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
1110515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
1111515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1112515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
1113515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
1114515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
1115515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
1116515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
1117515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
1118515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1119515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
1120515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
1121515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1122515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
1123515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
1124515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
1125515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
1126515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1127515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
1128515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
1129515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
1130c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1131c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1132515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
1133c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1134ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
113591268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
11361e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
1137d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
1138865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
1139865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
11401476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato        pw.println("  -c: write the current stats in checkin format.");
1141099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
1142c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
1143c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
1144d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
1145ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
1146ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
1147d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
1148d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
1149cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
1150fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
1151fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
1152fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
1153fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
1154fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
11550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
11561e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
1157fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
1158674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        pw.println("      pretend-screen-off: pretend the screen is off, even if screen state changes");
1159ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1160ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1161cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1162cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1163cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1164cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1165cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1166cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1167cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
11680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1169cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
11700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1171cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
11729a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
11739a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
11749a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
11759a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1176674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        } else if ("pretend-screen-off".equals(args[i])) {
1177674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            synchronized (mStats) {
1178674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani                mStats.setPretendScreenOff(enable);
1179674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            }
1180cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1181cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1182cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1183cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1184cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1185cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1186cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1187cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
11884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
11913abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
11923abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                != PackageManager.PERMISSION_GRANTED) {
11933abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            pw.println("Permission Denial: can't dump BatteryStats from from pid="
11943abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
11953abd75ba3a981850cac43a401d0014a836559cb0Kenny Root                    + " without permission " + android.Manifest.permission.DUMP);
11963abd75ba3a981850cac43a401d0014a836559cb0Kenny Root            return;
11973abd75ba3a981850cac43a401d0014a836559cb0Kenny Root        }
11983abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1199c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
12000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
12010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
12020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
120316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
1204c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
1205cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
1206e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
1207c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
1208c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
1209e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
12100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
12110068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
1212099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
1213c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1214c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
1215c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1216c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
1217c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
1218c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
1219c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
1220c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
1221c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1222c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
122316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
122449021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
12250068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
1226c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
1227c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1228c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1229d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1230d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1231e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1232e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
12333d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1234e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
12350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1237010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
12380ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
1239010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
12400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
12410ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
12420ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1245d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1246d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1247d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1248d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1249d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1250d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1251d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1252d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1253d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1254d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1255d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1256d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1257fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1258cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1259cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1260cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1261cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1262cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1263cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1264fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1265cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1266cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1267cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1268cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1269cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1270cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1271ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1272ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1273ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1274e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1275a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1276cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
12770ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1278ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1279cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1280cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1281cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1282cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1283e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey                        reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
1284cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1285cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1286cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1287cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1288cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1289cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1292e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
12930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
12940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12950ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
129613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
129713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
129813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
129913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
130013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
130113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
130213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
1303010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            updateExternalStatsSync("dump", BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
130413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
130513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1306d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
130713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1308ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1309ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1310ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
13111e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1312ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1313ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1314ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1315ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1316ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
13174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
13180068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (useCheckinFormat) {
13199cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
13200d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
13210068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
13220068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
13230068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
13240068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
13250068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
13260068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
13270068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
13280068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
13290068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
13300068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
13310068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
13320068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
13334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                                        null, mStats.mHandler, null);
13340068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
13350068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
13360068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
13370068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
13380068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
13390068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
13400068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
13419ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
13420068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
13430068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
13440068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
13450068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
13460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
13470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
1348cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
1349e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1350c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
135116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
135216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
135316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1354e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1355cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            Slog.d(TAG, "end dumpCheckinLocked");
1356e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
1357cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
1358e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1359c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
136016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
136116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
136216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1363e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
1364cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            Slog.d(TAG, "end dumpLocked");
13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1368010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private WifiActivityEnergyInfo extractDelta(WifiActivityEnergyInfo latest) {
1369010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long timePeriodMs = latest.mTimestamp - mLastInfo.mTimestamp;
1370010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long lastIdleMs = mLastInfo.mControllerIdleTimeMs;
1371010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long lastTxMs = mLastInfo.mControllerTxTimeMs;
1372010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long lastRxMs = mLastInfo.mControllerRxTimeMs;
1373010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final long lastEnergy = mLastInfo.mControllerEnergyUsed;
1374010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1375010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        // We will modify the last info object to be the delta, and store the new
1376010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        // WifiActivityEnergyInfo object as our last one.
1377010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final WifiActivityEnergyInfo delta = mLastInfo;
1378010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        delta.mTimestamp = latest.getTimeStamp();
1379010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        delta.mStackState = latest.getStackState();
1380010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1381684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        final long txTimeMs = latest.mControllerTxTimeMs - lastTxMs;
1382684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        final long rxTimeMs = latest.mControllerRxTimeMs - lastRxMs;
1383684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        final long idleTimeMs = latest.mControllerIdleTimeMs - lastIdleMs;
1384684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius
1385684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        if (txTimeMs < 0 || rxTimeMs < 0) {
1386010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            // The stats were reset by the WiFi system (which is why our delta is negative).
1387010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            // Returns the unaltered stats.
1388010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            delta.mControllerEnergyUsed = latest.mControllerEnergyUsed;
1389010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            delta.mControllerRxTimeMs = latest.mControllerRxTimeMs;
1390010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            delta.mControllerTxTimeMs = latest.mControllerTxTimeMs;
1391010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            delta.mControllerIdleTimeMs = latest.mControllerIdleTimeMs;
1392010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.v(TAG, "WiFi energy data was reset, new WiFi energy data is " + delta);
1393684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius        } else {
1394684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            final long totalActiveTimeMs = txTimeMs + rxTimeMs;
1395684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            long maxExpectedIdleTimeMs;
1396684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            if (totalActiveTimeMs > timePeriodMs) {
13972078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                // Cap the max idle time at zero since the active time consumed the whole time
13982078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                maxExpectedIdleTimeMs = 0;
13992078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                if (totalActiveTimeMs > timePeriodMs + MAX_WIFI_STATS_SAMPLE_ERROR_MILLIS) {
14002078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    StringBuilder sb = new StringBuilder();
14012078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append("Total Active time ");
14022078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(totalActiveTimeMs, sb);
14032078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" is longer than sample period ");
14042078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(timePeriodMs, sb);
14052078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(".\n");
14062078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append("Previous WiFi snapshot: ").append("idle=");
14072078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(lastIdleMs, sb);
14082078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" rx=");
14092078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(lastRxMs, sb);
14102078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" tx=");
14112078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(lastTxMs, sb);
14122078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" e=").append(lastEnergy);
14132078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append("\n");
14142078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append("Current WiFi snapshot: ").append("idle=");
14152078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(latest.mControllerIdleTimeMs, sb);
14162078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" rx=");
14172078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(latest.mControllerRxTimeMs, sb);
14182078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" tx=");
14192078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    TimeUtils.formatDuration(latest.mControllerTxTimeMs, sb);
14202078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    sb.append(" e=").append(latest.mControllerEnergyUsed);
14212078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                    Slog.wtf(TAG, sb.toString());
14222078d3499bca6cd6223ff76a5607eed7357aff22Roshan Pius                }
1423684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            } else {
1424684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius                maxExpectedIdleTimeMs = timePeriodMs - totalActiveTimeMs;
1425684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            }
1426684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // These times seem to be the most reliable.
1427684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            delta.mControllerTxTimeMs = txTimeMs;
1428684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            delta.mControllerRxTimeMs = rxTimeMs;
1429684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // WiFi calculates the idle time as a difference from the on time and the various
1430684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // Rx + Tx times. There seems to be some missing time there because this sometimes
1431684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // becomes negative. Just cap it at 0 and ensure that it is less than the expected idle
1432684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // time from the difference in timestamps.
1433684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            // b/21613534
1434684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            delta.mControllerIdleTimeMs = Math.min(maxExpectedIdleTimeMs, Math.max(0, idleTimeMs));
1435684591116fa6a8a2bf7a72dea19b496272f80af3Roshan Pius            delta.mControllerEnergyUsed = Math.max(0, latest.mControllerEnergyUsed - lastEnergy);
1436010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
1437010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1438010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        mLastInfo = latest;
1439010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        return delta;
14404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
14414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1442010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    /**
1443010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * Helper method to extract the Parcelable controller info from a
1444010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * SynchronousResultReceiver.
1445010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     */
1446010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static <T extends Parcelable> T awaitControllerInfo(
1447010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            @Nullable SynchronousResultReceiver receiver) throws TimeoutException {
1448010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (receiver == null) {
1449010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return null;
14504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
14514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1452010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final SynchronousResultReceiver.Result result =
1453010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                receiver.awaitResult(EXTERNAL_STATS_SYNC_TIMEOUT_MILLIS);
1454010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (result.bundle != null) {
1455010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            // This is the final destination for the Bundle.
1456010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            result.bundle.setDefusable(true);
1457010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1458010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            final T data = result.bundle.getParcelable(BatteryStats.RESULT_RECEIVER_CONTROLLER_KEY);
1459010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            if (data != null) {
1460010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                return data;
146121f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            }
146221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        }
1463010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        Slog.e(TAG, "no controller energy info supplied");
146421f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski        return null;
146521f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski    }
146621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski
14674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
14684b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Fetches data from external sources (WiFi controller, bluetooth chipset) and updates
14694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * batterystats with that information.
14704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     *
14714b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * We first grab a lock specific to this method, then once all the data has been collected,
14724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * we grab the mStats lock and update the data.
1473c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     *
1474c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski     * @param reason The reason why this collection was requested. Useful for debugging.
1475a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski     * @param updateFlags Which external stats to update. Can be a combination of
14769f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_CPU},
14779f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_RADIO},
14789f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_WIFI},
14799f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski     *                    and {@link BatteryStatsImpl.ExternalStatsSync#UPDATE_BT}.
14804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
1481010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    void updateExternalStatsSync(final String reason, int updateFlags) {
1482010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        SynchronousResultReceiver wifiReceiver = null;
1483010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        SynchronousResultReceiver bluetoothReceiver = null;
1484010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        SynchronousResultReceiver modemReceiver = null;
1485010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1486cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
14874b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mExternalStatsLock) {
1488e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            if (mContext == null) {
1489010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                // Don't do any work yet.
1490cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                Slog.d(TAG, "end updateExternalStatsSync");
1491e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski                return;
1492e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski            }
1493e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
14949f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) {
1495010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (mWifiManager == null) {
1496010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    mWifiManager = IWifiManager.Stub.asInterface(
1497010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                            ServiceManager.getService(Context.WIFI_SERVICE));
1498010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                }
1499a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1500010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (mWifiManager != null) {
1501010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    try {
1502010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        wifiReceiver = new SynchronousResultReceiver();
1503010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        mWifiManager.requestActivityInfo(wifiReceiver);
1504010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    } catch (RemoteException e) {
1505010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        // Oh well.
1506010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    }
1507010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                }
150821f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski            }
150921f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinski
15109f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_BT) != 0) {
1511010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                final BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
1512010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (adapter != null) {
1513010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    bluetoothReceiver = new SynchronousResultReceiver();
1514991357fe25b3addabf85b871df3f4098fc4b833bAdam Lesinski                    adapter.requestControllerActivityEnergyInfo(bluetoothReceiver);
1515010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                }
1516c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski            }
1517c14c273bf83d58a8049ac95a5a9885d0ba9c2188Adam Lesinski
1518010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO) != 0) {
1519010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (mTelephony == null) {
1520010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    mTelephony = TelephonyManager.from(mContext);
15210c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn                }
152272478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski
1523010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (mTelephony != null) {
1524010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    modemReceiver = new SynchronousResultReceiver();
1525010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    mTelephony.requestModemActivityInfo(modemReceiver);
1526a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1527010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            }
1528a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1529010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            WifiActivityEnergyInfo wifiInfo = null;
1530010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            BluetoothActivityEnergyInfo bluetoothInfo = null;
1531010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            ModemActivityInfo modemInfo = null;
1532010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            try {
1533010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                wifiInfo = awaitControllerInfo(wifiReceiver);
1534010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            } catch (TimeoutException e) {
1535010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                Slog.w(TAG, "Timeout reading wifi stats");
1536010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            }
1537010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1538010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            try {
1539010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                bluetoothInfo = awaitControllerInfo(bluetoothReceiver);
1540010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            } catch (TimeoutException e) {
1541010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                Slog.w(TAG, "Timeout reading bt stats");
1542010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            }
1543010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1544010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            try {
1545010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                modemInfo = awaitControllerInfo(modemReceiver);
1546010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            } catch (TimeoutException e) {
1547010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                Slog.w(TAG, "Timeout reading modem stats");
1548010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            }
1549010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1550010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            synchronized (mStats) {
1551010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                mStats.addHistoryEventLocked(
1552010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        SystemClock.elapsedRealtime(),
1553010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        SystemClock.uptimeMillis(),
1554010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS,
1555010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        reason, 0);
1556010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1557010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                mStats.updateCpuTimeLocked();
1558010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                mStats.updateKernelWakelocksLocked();
15592dd7e5e3ef0a20864a5908fd8c0896776575d68aJames Carr                mStats.updateKernelMemoryBandwidthLocked();
1560010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1561010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (wifiInfo != null) {
1562010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    if (wifiInfo.isValid()) {
1563010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        mStats.updateWifiStateLocked(extractDelta(wifiInfo));
1564010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    } else {
1565010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        Slog.e(TAG, "wifi info is invalid: " + wifiInfo);
1566010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    }
1567a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1568a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1569010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (bluetoothInfo != null) {
1570010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    if (bluetoothInfo.isValid()) {
1571010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        mStats.updateBluetoothStateLocked(bluetoothInfo);
1572010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    } else {
1573010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo);
1574010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    }
1575a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski                }
1576a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski
1577010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                if (modemInfo != null) {
1578010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    if (modemInfo.isValid()) {
1579010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(),
1580010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                                modemInfo);
1581010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    } else {
1582010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                        Slog.e(TAG, "modem info is invalid: " + modemInfo);
1583010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski                    }
158472478f053f403e29223dba6cc7be9e5bf115f670Adam Lesinski                }
15854b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            }
15864b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
1587cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        Slog.d(TAG, "end updateExternalStatsSync");
15884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
1589713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1590713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1591713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a particular uid.
1592713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1593713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1594713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler takeUidSnapshot(int requestUid) {
1595713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (requestUid != Binder.getCallingUid()) {
1596713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1597713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1598713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1599713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1600713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1601010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            updateExternalStatsSync("get-health-stats-for-uid",
1602713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
1603713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1604713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return getHealthStatsForUidLocked(requestUid);
1605713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1606713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
1607713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Slog.d(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
1608713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1609713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1610713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1611713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1612713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1613713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1614713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1615713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a number of uids.
1616713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1617713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1618713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) {
1619713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (!onlyCaller(requestUids)) {
1620713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1621713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1622713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1623713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1624713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        int i=-1;
1625713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1626010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            updateExternalStatsSync("get-health-stats-for-uids",
1627713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    BatteryStatsImpl.ExternalStatsSync.UPDATE_ALL);
1628713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1629713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final int N = requestUids.length;
1630713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final HealthStatsParceler[] results = new HealthStatsParceler[N];
1631713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                for (i=0; i<N; i++) {
1632713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    results[i] = getHealthStatsForUidLocked(requestUids[i]);
1633713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                }
1634713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return results;
1635713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1636713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
1637713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
1638713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    + Arrays.toString(requestUids) + ") i=" + i, ex);
1639713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1640713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1641713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1642713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1643713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1644713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1645713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1646713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Returns whether the Binder.getCallingUid is the only thing in requestUids.
1647713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1648713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    private static boolean onlyCaller(int[] requestUids) {
1649713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int caller = Binder.getCallingUid();
1650713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int N = requestUids.length;
1651713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        for (int i=0; i<N; i++) {
1652713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            if (requestUids[i] != caller) {
1653713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return false;
1654713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1655713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1656713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return true;
1657713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1658713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1659713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1660713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a HealthStatsParceler for the given uid. You should probably call
1661010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * updateExternalStatsSync first.
1662713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1663713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    HealthStatsParceler getHealthStatsForUidLocked(int requestUid) {
1664713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter();
1665713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS);
1666713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid);
1667713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (uid != null) {
1668713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            writer.writeUid(uidWriter, mStats, uid);
1669713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1670713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return new HealthStatsParceler(uidWriter);
1671713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1672713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1674