BatteryStatsService.java revision a1fd057c859573a85ca79b21ea5c3f27423eb0df
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
21e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo;
223abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager;
234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo;
242eccd0262827259d15ceaa0fca975d3243c3a699Makoto Onukiimport android.os.PowerManager.ServiceType;
25455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.os.PowerSaveState;
2691268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats;
27c8a4324855ff31f605fe28342673945dbf413e8dDavid Chenimport android.os.BatteryStatsInternal;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
296f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
320068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor;
339ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException;
34cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
37e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
38cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
39e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shuklaimport android.os.UserManagerInternal;
407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
41a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Rayimport android.os.connectivity.CellularBatteryStats;
42713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler;
43713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter;
44713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats;
4506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
4621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo;
47e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
48e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
498a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
50674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani
5132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
52d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
5332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
54e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
5550df711a5125460acb8d2960ffc0a1f17a818103Bookatzimport com.android.internal.os.RpmStats;
56fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeyimport com.android.internal.util.DumpUtils;
57cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
587ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yuimport android.util.StatsLog;
5932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
64515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
65515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
66515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
67515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
68515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
69713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays;
70e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
71b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.ExecutionException;
72b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.Future;
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
78cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
7968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        implements PowerManagerInternal.LowPowerModeListener,
8068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        BatteryStatsImpl.PlatformIdleStateCallback {
81c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
8282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato    static final boolean DBG = false;
83c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
84010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static IBatteryStats sService;
85010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
87e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider;
88b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final Context mContext;
89b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final BatteryExternalStatsWorker mWorker;
904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
9150df711a5125460acb8d2960ffc0a1f17a818103Bookatz    private native void getLowPowerStats(RpmStats rpmStats);
9268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
93d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    private native int getSubsystemLowPowerStats(ByteBuffer outBuffer);
9468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
9568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .newDecoder()
9668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onMalformedInput(CodingErrorAction.REPLACE)
9768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
9868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .replaceWith("?");
9968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE);
10068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE);
10168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private static final int MAX_LOW_POWER_STATS_SIZE = 512;
10268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
10350df711a5125460acb8d2960ffc0a1f17a818103Bookatz    /**
10450df711a5125460acb8d2960ffc0a1f17a818103Bookatz     * Replaces the information in the given rpmStats with up-to-date information.
10550df711a5125460acb8d2960ffc0a1f17a818103Bookatz     */
10650df711a5125460acb8d2960ffc0a1f17a818103Bookatz    @Override
10750df711a5125460acb8d2960ffc0a1f17a818103Bookatz    public void fillLowPowerStats(RpmStats rpmStats) {
10850df711a5125460acb8d2960ffc0a1f17a818103Bookatz        if (DBG) Slog.d(TAG, "begin getLowPowerStats");
10950df711a5125460acb8d2960ffc0a1f17a818103Bookatz        try {
11050df711a5125460acb8d2960ffc0a1f17a818103Bookatz            getLowPowerStats(rpmStats);
11150df711a5125460acb8d2960ffc0a1f17a818103Bookatz        } finally {
11250df711a5125460acb8d2960ffc0a1f17a818103Bookatz            if (DBG) Slog.d(TAG, "end getLowPowerStats");
11350df711a5125460acb8d2960ffc0a1f17a818103Bookatz        }
11450df711a5125460acb8d2960ffc0a1f17a818103Bookatz    }
11550df711a5125460acb8d2960ffc0a1f17a818103Bookatz
11668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    @Override
11768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    public String getPlatformLowPowerStats() {
11882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
119cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        try {
120cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.clear();
121cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.clear();
122cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.reset();
123cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat);
124cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            if (bytesWritten < 0) {
125cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return null;
126cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            } else if (bytesWritten == 0) {
127cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return "Empty";
128cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            }
129cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.limit(bytesWritten);
130cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
131cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.flip();
132cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            return mUtf16BufferStat.toString();
133cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        } finally {
13482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats");
13568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        }
13668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    }
13768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
138d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    @Override
139d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    public String getSubsystemLowPowerStats() {
14050df711a5125460acb8d2960ffc0a1f17a818103Bookatz        if (DBG) Slog.d(TAG, "begin getSubsystemLowPowerStats");
141d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        try {
142d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.clear();
143d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.clear();
144d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.reset();
145d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            int bytesWritten = getSubsystemLowPowerStats(mUtf8BufferStat);
146d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            if (bytesWritten < 0) {
147d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return null;
148d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            } else if (bytesWritten == 0) {
149d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return "Empty";
150d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            }
151d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.limit(bytesWritten);
152d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
153d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.flip();
154d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            return mUtf16BufferStat.toString();
155d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        } finally {
15650df711a5125460acb8d2960ffc0a1f17a818103Bookatz            if (DBG) Slog.d(TAG, "end getSubsystemLowPowerStats");
157d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        }
158d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    }
159d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy
160b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    BatteryStatsService(Context context, File systemDir, Handler handler) {
1614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
162b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mContext = context;
163e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() {
164e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            private UserManagerInternal umi;
165e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            @Override
166e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            public int[] getUserIds() {
167e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                if (umi == null) {
168e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                    umi = LocalServices.getService(UserManagerInternal.class);
169e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                }
170e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                return (umi != null) ? umi.getUserIds() : null;
171e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            }
172e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        };
173e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        mStats = new BatteryStatsImpl(systemDir, handler, this, mUserManagerUserInfoProvider);
174b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker = new BatteryExternalStatsWorker(context, mStats);
175b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setExternalStatsSyncLocked(mWorker);
176b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
177b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);
178b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setPowerProfileLocked(new PowerProfile(context));
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
181b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    public void publish() {
182c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        LocalServices.addService(BatteryStatsInternal.class, new LocalService());
1836832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
1842c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1852c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
186c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen    private final class LocalService extends BatteryStatsInternal {
187c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        @Override
188c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        public String[] getWifiIfaces() {
189c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen            return mStats.getWifiIfaces().clone();
190c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        }
191c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen
192c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        @Override
193c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        public String[] getMobileIfaces() {
194c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen            return mStats.getMobileIfaces().clone();
195c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        }
196c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen    }
197c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen
198b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private static void awaitUninterruptibly(Future<?> future) {
199b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        while (true) {
200b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            try {
201b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                future.get();
202b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
203b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (ExecutionException e) {
204b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
205b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (InterruptedException e) {
206b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                // Keep looping
207b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
208b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        }
209b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    }
210b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
2112c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
2122c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
2132c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
2142c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
2152c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
216010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
217010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        powerMgr.registerLowPowerModeObserver(this);
21814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        synchronized (mStats) {
21914ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(
22014ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                    powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
22114ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                            .batterySaverEnabled);
22214ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
223c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
2242c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
2252c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
22655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
2278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
2284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
229b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("shutdown", BatteryExternalStatsWorker.UPDATE_ALL));
230b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
23155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
2326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
23355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
23420b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski
23520b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        // Shutdown the thread we made.
236b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.shutdown();
23755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
2382f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
24391268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
247cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
248cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
249455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public int getServiceType() {
250455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei        return ServiceType.BATTERY_STATS;
251455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
252455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
253455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    @Override
254455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public void onLowPowerModeChanged(PowerSaveState result) {
255cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
25614ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(result.batterySaverEnabled);
257cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
258cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
259cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2714b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2734b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
274b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleWrite();
2754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2772f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
2782f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
279b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
280b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
281b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
282b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
283b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
284b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
285b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
286b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
287b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
288e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    void onCleanupUser(int userId) {
289e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        synchronized (mStats) {
290e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            mStats.onCleanupUserLocked(userId);
291e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        }
292e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    }
293e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla
294e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    void onUserRemoved(int userId) {
295e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        synchronized (mStats) {
296e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            mStats.onUserRemovedLocked(userId);
297e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        }
298e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    }
299e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla
3002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
3022f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
3032f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3042f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3052f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3062f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
3072f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
30861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
3092f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3102f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3112f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3122f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
3132f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
3142f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
315c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            // TODO: decide where this should be and use a constant instead of a literal.
316c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 1);
3172f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3192f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3201e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
3211e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3221e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
323c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            // TODO: decide where this should be and use a constant instead of a literal.
324c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 2);
3251e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3261e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3271e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
3281e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
3291e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3301e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
331c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            // TODO: decide where this should be and use a constant instead of a literal.
332c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 3);
3331e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3341e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3351e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
336a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteProcessFinish(String name, int uid) {
3372f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
338a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
339c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            // TODO: decide where this should be and use a constant instead of a literal.
340c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 0);
3412f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3422f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3432f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
344a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteUidProcessState(int uid, int state) {
3452f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
346d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen            // TODO: remove this once we figure out properly where and how
347c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            StatsLog.write(StatsLog.UID_PROCESS_STATE_CHANGED, uid, state);
348d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
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();
361b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.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();
376b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.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
43894326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn    public void noteJobFinish(String name, int uid, int stopReason) {
439fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
440fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
44194326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn            mStats.noteJobFinishLocked(name, uid, stopReason);
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    }
52329fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
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    }
53029fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
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    }
55129fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
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    }
55829fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
559e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
56182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteScreenState");
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
563931945399859ab91545ba2c2a914f044092d5e2eJoe Onorato            // TODO: remove this once we figure out properly where and how
564d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen            StatsLog.write(StatsLog.SCREEN_STATE_CHANGED, state);
565d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
566d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen            mStats.noteScreenStateLocked(state);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
56882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteScreenState");
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
57029fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
573617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
574c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            StatsLog.write(StatsLog.SCREEN_BRIGHTNESS_CHANGED, brightness);
575617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
576617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
577617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
578e03583e261227d76ec4dec3d4e9dc9488a0623ccyro
579e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
582e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
585e03583e261227d76ec4dec3d4e9dc9488a0623ccyro
586280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
587280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
588280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
589280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
590280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
591280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
592280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
593e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
596e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
597617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
598617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
599e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
6001e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
6011e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
6021e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
6031e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
6041e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
6051e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
6061e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
607fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi    public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
608e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
609b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        final boolean update;
610e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
61114ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid);
61214ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
61314ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski
61414ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        if (update) {
615b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("modem-data", BatteryExternalStatsWorker.UPDATE_RADIO);
616e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
617e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
618e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6252f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6322f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
633e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
634627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
635627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
636e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
637627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
638627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
6392f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
640627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
641627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
642627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
643627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
644627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
645627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
64632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
647f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
64832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
649e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
65032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
651e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
65232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
65332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
65432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
65558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
657105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
65858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
659105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
660105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
6612f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
66258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
663105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
664105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
66558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
666105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
667105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
668d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
669244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
670244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
671244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
672244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
673244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
674244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
675244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
676244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
677244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
678244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
679244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
680244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
681244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
682244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
683244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
684244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
685244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
686244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
687244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
688244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
689244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
690244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
691244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
692244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
693244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
694244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
695244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
696244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
69710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
69810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
69910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
70010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
70110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
70210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
70310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
70410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
70510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
70610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
70710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
70810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
70910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
71010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
7116d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
712abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
713abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
7146d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
715abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
716abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
717abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
7186d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
719abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
720abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
7216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
7226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7246d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
7266d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
72782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteStartCamera");
7286d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7296d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
7306d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
73182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteStartCamera");
7326d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7336d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7346d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
7356d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7366d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7376d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
7386d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7396d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7406d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7416d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
7426d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7436d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7446d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
7456d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7466d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7476d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7486d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
7496d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7506d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7516d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
752abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
753abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
754abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
755e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
7565f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) {
757e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
758e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
759e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
760e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
7610c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
762a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
76306f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
76406f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
76506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
766b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                mWorker.scheduleSync("wifi-data: " + type, BatteryExternalStatsWorker.UPDATE_WIFI);
767a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
7685f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski            mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
7690c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
770e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
771e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
77258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
773d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
774d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
77558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
776d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
777d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
778d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
77958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
780d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
781d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
78258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
78358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
78458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
78558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
78658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
78758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
78858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
78958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
790d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
791d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
792d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
793ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
794ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
795ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
796ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
797ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
798ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
799ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
8003251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
8013251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
8023251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
8033251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
8043251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
8053251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
8063251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
8073251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
8083251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
8093251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
8103251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
8113251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
8123251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
8133251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
815105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
818105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
819105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8202f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
821105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
822105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
823105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
824105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
825105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
826105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8276ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8286ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
829105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
830105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8316ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
832105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
833105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8346ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8356ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
836105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
837105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8386ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
840105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
8435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
8465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
8505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
8535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
8577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
8607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
8647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
8677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8706ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
8717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8736ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
8747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8776ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
8787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8806ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
8817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
884a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
885a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
886a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
887a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
888a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
889a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
890a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
891a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
892a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
893a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
894a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
895a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
896a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
897a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
8987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
8997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
9007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
9017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
9027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
9037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
9047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
9054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
9067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
9077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
9087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
9097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
9107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
9117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
9127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
9137a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
9144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
9151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
9161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
9174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
9181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
9191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
9201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
9217a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
9227a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
9237a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
924b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // During device boot, qtaguid isn't enabled until after the inital
925b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // loading of battery stats. Now that they're enabled, take our initial
926b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // snapshot for future delta calculation.
927b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleSync("network-stats-enabled",
928b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                BatteryExternalStatsWorker.UPDATE_RADIO | BatteryExternalStatsWorker.UPDATE_WIFI);
9297a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
9307a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
9318ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
93208c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
9338ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9348ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
93508c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
9368ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9378ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9388ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9393accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn    public void notePackageInstalled(String pkgName, long versionCode) {
9408ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9418ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9428ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
9438ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9448ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9458ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9468ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
9478ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9488ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9498ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
9508ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9518ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9528ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9536771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
954b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz    public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) {
9556771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9569f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
957b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz            mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized);
9589f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9596771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9606771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
9616771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
96294c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz    public void noteBleScanStopped(WorkSource ws, boolean isUnoptimized) {
9636771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9649f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
96594c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz            mStats.noteBluetoothScanStoppedFromSourceLocked(ws, isUnoptimized);
9669f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9679f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
9689f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
9699f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    @Override
9709f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public void noteResetBleScan() {
9719f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        enforceCallingPermission();
9729f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9739f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteResetBluetoothScanLocked();
9749f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
975956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    }
976956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz
977956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    @Override
9784ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz    public void noteBleScanResults(WorkSource ws, int numNewResults) {
979956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        enforceCallingPermission();
980956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        synchronized (mStats) {
9814ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz            mStats.noteBluetoothScanResultsFromSourceLocked(ws, numNewResults);
982956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        }
9836771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9846771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
985010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
986010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteWifiControllerActivity(WifiActivityEnergyInfo info) {
987010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
988010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
989010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
990010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid wifi data given: " + info);
991010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
992010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
993010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
99414ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateWifiState(info);
995010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
996010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
997010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
998010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) {
999010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
1000010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
1001010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid bluetooth data given: " + info);
1002010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
1003010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
1004010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1005b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.updateBluetoothStateLocked(info);
1006010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
1007010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1008010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
1009010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteModemControllerActivity(ModemActivityInfo info) {
1010010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
1011010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1012010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
1013010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid modem data given: " + info);
1014010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
1015010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
1016010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
101714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateMobileRadioState(info);
1018010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
1019010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1024d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
1025d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
1026041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int level, final int temp, final int volt, final int chargeUAh,
1027041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int chargeFullUAh) {
1028d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
1029d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1030d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
1031d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
1032b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleRunnable(() -> {
1033b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            synchronized (mStats) {
1034b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
1035b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                if (mStats.isOnBattery() == onBattery) {
1036b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // The battery state has not changed, so we don't need to sync external
1037b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // stats immediately.
1038b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1039b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                            chargeUAh, chargeFullUAh);
1040b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    return;
1041d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1042b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
1043d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1044b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Sync external stats first as the battery has changed states. If we don't sync
1045b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // before changing the state, we may not collect the relevant data later.
1046b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Order here is guaranteed since we're scheduling from the same thread and we are
1047b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // using a single threaded executor.
1048b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("battery-state", BatteryExternalStatsWorker.UPDATE_ALL);
1049b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleRunnable(() -> {
1050d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
1051926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1052041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski                            chargeUAh, chargeFullUAh);
1053d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1054b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            });
1055d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
1056633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
10572f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1077c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1078c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
1079515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
1080515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
1081515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
1082515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
1083c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1084c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
1085c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
1086c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1087c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1088c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
1089c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
1090c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1091515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
1092515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
1093515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
1094515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
1095515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
1096515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1097515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
1098515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
1099515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1100c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
1101515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
1102515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
1103c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
1104515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
1105c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1106c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
1107c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
1108c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
1109c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
1110c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1111515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1112515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
1113515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
1114515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
1115515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
1116515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1117515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
1118515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
1119515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
1120515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
1121515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
1122515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
1123515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1124515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
1125515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
1126515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1127515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
1128515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
1129515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
1130515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
1131515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1132515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
1133515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
1134515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
1135c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1136c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1137515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
1138c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1139ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
114091268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
11411e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
1142d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
1143865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
1144865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
11451476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato        pw.println("  -c: write the current stats in checkin format.");
1146099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
1147c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
1148c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
1149d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
1150ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
1151ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
1152d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
1153d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
1154cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
1155fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
1156fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
1157fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
1158fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
1159fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
11600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
11611e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
1162fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
1163674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        pw.println("      pretend-screen-off: pretend the screen is off, even if screen state changes");
1164ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1165ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1166cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1167cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1168cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1169cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1170cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1171cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1172cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
11730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1174cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
11750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1176cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
11779a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
11789a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
11799a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
11809a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1181674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        } else if ("pretend-screen-off".equals(args[i])) {
1182674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            synchronized (mStats) {
1183674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani                mStats.setPretendScreenOff(enable);
1184674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            }
1185cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1186cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1187cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1188cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1189cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1190cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1191cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1192cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
11934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
11966df866a8510af2776c48425a361f708ae7f5d7d6Jeff Sharkey        if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
11973abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1198c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
11990068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
12002f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams        boolean toProto = 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;
12272f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                } else if ("--proto".equals(arg)) {
12282f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    toProto = true;
1229c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1230c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1231d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1232d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1233e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1234e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
12353d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1236e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
12370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1239b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL);
12400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
1241b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    awaitUninterruptibly(mWorker.scheduleSync("dump",
1242b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                            BatteryExternalStatsWorker.UPDATE_ALL));
12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
12450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
12460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1248d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1249d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1250d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1251d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1252d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1253d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1254d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1255d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1256d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1257d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1258d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1259d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1260fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1261cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1262cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1263cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1264cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1265cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1266cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1267fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1268cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1269cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1270cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1271cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1272cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1273cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1274ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1275ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1276ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1277e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1278a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1279cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
12800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1281ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1282cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1283cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1284cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1285cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1286e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey                        reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
1287cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1288cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1289cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1290cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1291cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1292cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1295e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
12960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
12970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
129913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
130013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
130113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
130213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
130313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
130413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
130513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
1306b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL));
130713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
130813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1309d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
131013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1311ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1312ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1313ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
13141e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1315ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1316ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1317ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1318ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1319ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
13204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
13212f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams        if (toProto) {
13222f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
13232f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
13242f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            if (isRealCheckin) {
13252f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                // For a real checkin, first we want to prefer to use the last complete checkin
13262f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                // file if there is one.
13272f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                synchronized (mStats.mCheckinFile) {
13282f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    if (mStats.mCheckinFile.exists()) {
13292f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                        try {
13302f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            byte[] raw = mStats.mCheckinFile.readFully();
13312f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            if (raw != null) {
13322f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                Parcel in = Parcel.obtain();
13332f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                in.unmarshall(raw, 0, raw.length);
13342f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                in.setDataPosition(0);
13352f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
13362f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                        null, mStats.mHandler, null, mUserManagerUserInfoProvider);
13372f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                checkinStats.readSummaryFromParcel(in);
13382f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                in.recycle();
13396ccebf23933c3bb8a79623e6ce190afdb150cb31Kweku Adams                                checkinStats.dumpProtoLocked(mContext, fd, apps, flags);
13402f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                mStats.mCheckinFile.delete();
13412f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                return;
13422f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            }
13432f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                        } catch (IOException | ParcelFormatException e) {
13442f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            Slog.w(TAG, "Failure reading checkin file "
13452f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                    + mStats.mCheckinFile.getBaseFile(), e);
13462f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                        }
13472f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    }
13482f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                }
13492f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            }
13502f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            if (DBG) Slog.d(TAG, "begin dumpProtoLocked from UID " + Binder.getCallingUid());
13512f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            synchronized (mStats) {
13526ccebf23933c3bb8a79623e6ce190afdb150cb31Kweku Adams                mStats.dumpProtoLocked(mContext, fd, apps, flags);
13532f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                if (writeData) {
13542f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    mStats.writeAsyncLocked();
13552f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                }
13562f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            }
13572f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            if (DBG) Slog.d(TAG, "end dumpProtoLocked");
13582f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams        } else if (useCheckinFormat) {
13599cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
13600d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
13610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
13620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
13630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
13640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
13650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
13660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
13670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
13680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
13690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
13700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
13710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
13720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
1373e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                                        null, mStats.mHandler, null, mUserManagerUserInfoProvider);
13740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
13750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
13760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
13770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
13780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
13790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
13800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
13819ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
13820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
13830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
13840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
13850068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
13860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
13870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
138882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
1389e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1390c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
139116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
139216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
139316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1394e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
139582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpCheckinLocked");
1396e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
139782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
1398e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1399c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
140016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
140116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
140216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1403e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
140482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpLocked");
14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
14074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1408713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1409a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray     * Gets a snapshot of cellular stats
1410a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray     * @hide
1411a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray     */
1412a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray    public CellularBatteryStats getCellularBatteryStats() {
1413a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray        synchronized (mStats) {
1414a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray            return mStats.getCellularBatteryStats();
1415a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray        }
1416a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray    }
1417a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray
1418a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray    /**
1419713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a particular uid.
1420713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1421713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1422713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler takeUidSnapshot(int requestUid) {
1423713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (requestUid != Binder.getCallingUid()) {
1424713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1425713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1426713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1427713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1428713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1429b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
1430b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    BatteryExternalStatsWorker.UPDATE_ALL));
1431713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1432713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return getHealthStatsForUidLocked(requestUid);
1433713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1434713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
143582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
1436713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1437713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1438713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1439713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1440713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1441713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1442713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1443713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a number of uids.
1444713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1445713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1446713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) {
1447713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (!onlyCaller(requestUids)) {
1448713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1449713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1450713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1451713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1452713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        int i=-1;
1453713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1454b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
1455b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    BatteryExternalStatsWorker.UPDATE_ALL));
1456713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1457713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final int N = requestUids.length;
1458713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final HealthStatsParceler[] results = new HealthStatsParceler[N];
1459713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                for (i=0; i<N; i++) {
1460713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    results[i] = getHealthStatsForUidLocked(requestUids[i]);
1461713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                }
1462713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return results;
1463713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1464713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
146582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
1466713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    + Arrays.toString(requestUids) + ") i=" + i, ex);
1467713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1468713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1469713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1470713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1471713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1472713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1473713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1474713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Returns whether the Binder.getCallingUid is the only thing in requestUids.
1475713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1476713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    private static boolean onlyCaller(int[] requestUids) {
1477713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int caller = Binder.getCallingUid();
1478713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int N = requestUids.length;
1479713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        for (int i=0; i<N; i++) {
1480713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            if (requestUids[i] != caller) {
1481713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return false;
1482713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1483713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1484713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return true;
1485713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1486713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1487713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1488713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a HealthStatsParceler for the given uid. You should probably call
1489010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * updateExternalStatsSync first.
1490713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1491713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    HealthStatsParceler getHealthStatsForUidLocked(int requestUid) {
1492713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter();
1493713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS);
1494713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid);
1495713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (uid != null) {
1496713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            writer.writeUid(uidWriter, mStats, uid);
1497713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1498713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return new HealthStatsParceler(uidWriter);
1499713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1500713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1502