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
19db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatzimport android.app.ActivityManager;
20235343daec5c052fc20b7186967ff60b0a1a6df7Bookatzimport android.app.job.JobProtoEnums;
214b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
23e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo;
243abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager;
254b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo;
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;
34fbc01fcbd5cae80c56745102b40d6b764050d630Mike Maimport android.os.PowerManager.ServiceType;
35cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
36fbc01fcbd5cae80c56745102b40d6b764050d630Mike Maimport android.os.PowerSaveState;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
39e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
40cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
41e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shuklaimport android.os.UserManagerInternal;
427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
43a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Rayimport android.os.connectivity.CellularBatteryStats;
4478ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Rayimport android.os.connectivity.GpsBatteryStats;
45fbc01fcbd5cae80c56745102b40d6b764050d630Mike Maimport android.os.connectivity.WifiBatteryStats;
46713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler;
47713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter;
48713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats;
4906f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
5021f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo;
51e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
52e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
538a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
54fbc01fcbd5cae80c56745102b40d6b764050d630Mike Maimport android.util.StatsLog;
55674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani
5632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
57d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
5832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
59e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
6050df711a5125460acb8d2960ffc0a1f17a818103Bookatzimport com.android.internal.os.RpmStats;
61fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeyimport com.android.internal.util.DumpUtils;
62cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
6332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
68515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
69515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
70515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
71515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
72515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
73713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays;
74e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
75b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.ExecutionException;
76b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.Future;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
82cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
8368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        implements PowerManagerInternal.LowPowerModeListener,
8468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        BatteryStatsImpl.PlatformIdleStateCallback {
85c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
8682ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato    static final boolean DBG = false;
87c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
88010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static IBatteryStats sService;
89010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
91e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider;
92b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final Context mContext;
93b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final BatteryExternalStatsWorker mWorker;
944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
9550df711a5125460acb8d2960ffc0a1f17a818103Bookatz    private native void getLowPowerStats(RpmStats rpmStats);
9668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
97d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    private native int getSubsystemLowPowerStats(ByteBuffer outBuffer);
9868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
9968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .newDecoder()
10068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onMalformedInput(CodingErrorAction.REPLACE)
10168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
10268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .replaceWith("?");
10368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE);
10468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE);
10503ad13e587962ad2cadb81df759afca3e7d15dabKelly Rossmoyer    private static final int MAX_LOW_POWER_STATS_SIZE = 2048;
10668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
10750df711a5125460acb8d2960ffc0a1f17a818103Bookatz    /**
10850df711a5125460acb8d2960ffc0a1f17a818103Bookatz     * Replaces the information in the given rpmStats with up-to-date information.
10950df711a5125460acb8d2960ffc0a1f17a818103Bookatz     */
11050df711a5125460acb8d2960ffc0a1f17a818103Bookatz    @Override
11150df711a5125460acb8d2960ffc0a1f17a818103Bookatz    public void fillLowPowerStats(RpmStats rpmStats) {
11250df711a5125460acb8d2960ffc0a1f17a818103Bookatz        if (DBG) Slog.d(TAG, "begin getLowPowerStats");
11350df711a5125460acb8d2960ffc0a1f17a818103Bookatz        try {
11450df711a5125460acb8d2960ffc0a1f17a818103Bookatz            getLowPowerStats(rpmStats);
11550df711a5125460acb8d2960ffc0a1f17a818103Bookatz        } finally {
11650df711a5125460acb8d2960ffc0a1f17a818103Bookatz            if (DBG) Slog.d(TAG, "end getLowPowerStats");
11750df711a5125460acb8d2960ffc0a1f17a818103Bookatz        }
11850df711a5125460acb8d2960ffc0a1f17a818103Bookatz    }
11950df711a5125460acb8d2960ffc0a1f17a818103Bookatz
12068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    @Override
12168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    public String getPlatformLowPowerStats() {
12282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
123cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        try {
124cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.clear();
125cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.clear();
126cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.reset();
127cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat);
128cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            if (bytesWritten < 0) {
129cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return null;
130cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            } else if (bytesWritten == 0) {
131cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return "Empty";
132cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            }
133cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.limit(bytesWritten);
134cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
135cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.flip();
136cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            return mUtf16BufferStat.toString();
137cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        } finally {
13882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats");
13968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        }
14068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    }
14168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
142d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    @Override
143d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    public String getSubsystemLowPowerStats() {
14450df711a5125460acb8d2960ffc0a1f17a818103Bookatz        if (DBG) Slog.d(TAG, "begin getSubsystemLowPowerStats");
145d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        try {
146d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.clear();
147d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.clear();
148d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.reset();
149d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            int bytesWritten = getSubsystemLowPowerStats(mUtf8BufferStat);
150d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            if (bytesWritten < 0) {
151d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return null;
152d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            } else if (bytesWritten == 0) {
153d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return "Empty";
154d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            }
155d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.limit(bytesWritten);
156d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
157d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.flip();
158d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            return mUtf16BufferStat.toString();
159d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        } finally {
16050df711a5125460acb8d2960ffc0a1f17a818103Bookatz            if (DBG) Slog.d(TAG, "end getSubsystemLowPowerStats");
161d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        }
162d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    }
163d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy
164b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    BatteryStatsService(Context context, File systemDir, Handler handler) {
1654b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
166b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mContext = context;
167e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() {
168e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            private UserManagerInternal umi;
169e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            @Override
170e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            public int[] getUserIds() {
171e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                if (umi == null) {
172e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                    umi = LocalServices.getService(UserManagerInternal.class);
173e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                }
174e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                return (umi != null) ? umi.getUserIds() : null;
175e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            }
176e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        };
177e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        mStats = new BatteryStatsImpl(systemDir, handler, this, mUserManagerUserInfoProvider);
178b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker = new BatteryExternalStatsWorker(context, mStats);
179b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setExternalStatsSyncLocked(mWorker);
180b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
181b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);
182b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setPowerProfileLocked(new PowerProfile(context));
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
18468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
185b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    public void publish() {
186c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        LocalServices.addService(BatteryStatsInternal.class, new LocalService());
1876832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
1882c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1892c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
1905c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka    public void systemServicesReady() {
1915c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka        mStats.systemServicesReady(mContext);
1925c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka    }
1935c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka
194c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen    private final class LocalService extends BatteryStatsInternal {
195c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        @Override
196c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        public String[] getWifiIfaces() {
197c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen            return mStats.getWifiIfaces().clone();
198c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        }
199c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen
200c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        @Override
201c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        public String[] getMobileIfaces() {
202c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen            return mStats.getMobileIfaces().clone();
203c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen        }
204977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani
205977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani        @Override
206977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani        public void noteJobsDeferred(int uid, int numDeferred, long sinceLast) {
207977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani            if (DBG) Slog.d(TAG, "Jobs deferred " + uid + ": " + numDeferred + " " + sinceLast);
208977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani            BatteryStatsService.this.noteJobsDeferred(uid, numDeferred, sinceLast);
209977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani        }
210c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen    }
211c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen
212b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private static void awaitUninterruptibly(Future<?> future) {
213b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        while (true) {
214b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            try {
215b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                future.get();
216b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
217b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (ExecutionException e) {
218b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
219b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (InterruptedException e) {
220b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                // Keep looping
221b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
222b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        }
223b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    }
224b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
225b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    private void syncStats(String reason, int flags) {
226b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        awaitUninterruptibly(mWorker.scheduleSync(reason, flags));
227b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka    }
228b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka
2292c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
2302c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
2312c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
2322c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
2332c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
234010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
235010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        powerMgr.registerLowPowerModeObserver(this);
23614ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        synchronized (mStats) {
23714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(
23814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                    powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
23914ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                            .batterySaverEnabled);
24014ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
241c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
2422c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
2432c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
24455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
2458a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
2464b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
247b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        syncStats("shutdown", BatteryExternalStatsWorker.UPDATE_ALL);
248b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
24955280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
2506b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
25155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
25220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski
25320b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        // Shutdown the thread we made.
254b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.shutdown();
25555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
2562f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
26191268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
265cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
266cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
267455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public int getServiceType() {
268455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei        return ServiceType.BATTERY_STATS;
269455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
270455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
271455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    @Override
272455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public void onLowPowerModeChanged(PowerSaveState result) {
273cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
27414ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(result.batterySaverEnabled);
275cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
276cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
277cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2874b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2894b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
292b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleWrite();
2934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
2962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
297b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
298b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
299b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
300b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
301b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
302b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
303b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
304b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
305b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
306e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    void onCleanupUser(int userId) {
307e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        synchronized (mStats) {
308e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            mStats.onCleanupUserLocked(userId);
309e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        }
310e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    }
311e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla
312e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    void onUserRemoved(int userId) {
313e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        synchronized (mStats) {
314e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            mStats.onUserRemovedLocked(userId);
315e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        }
316e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    }
317e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla
3182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
3192f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
3202f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
3212f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3222f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3242f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
3252f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
32661db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
3272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3282f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3292f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3302f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
3312f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
3322f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
3339086762d565aa9fd92b306cd61c892038bef64fcBookatz            StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name,
3345caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu                    StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__STARTED);
3352f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3362f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3372f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3381e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
3391e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3401e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
3419086762d565aa9fd92b306cd61c892038bef64fcBookatz            StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name,
3425caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu                    StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__CRASHED);
3431e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3441e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3451e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
3461e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
3471e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3481e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
3491e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3501e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3511e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
352a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteProcessFinish(String name, int uid) {
3532f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
354a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
3559086762d565aa9fd92b306cd61c892038bef64fcBookatz            StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name,
3565caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu                    StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED__STATE__FINISHED);
3572f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3582f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3592f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
360db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz    /** @param state Process state from ActivityManager.java. */
361a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteUidProcessState(int uid, int state) {
3622f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
363db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz            StatsLog.write(StatsLog.UID_PROCESS_STATE_CHANGED, uid,
364db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                    ActivityManager.processStateAmToProto(state));
365d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
366a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteUidProcessStateLocked(uid, state);
3672f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3682f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3692f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3702f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
3712f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
3758a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
3768a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
378b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        syncStats("get-stats", BatteryExternalStatsWorker.UPDATE_ALL);
3794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3804b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
3880068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
3890068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
3900068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
3910068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3920068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
393b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka        syncStats("get-stats", BatteryExternalStatsWorker.UPDATE_ALL);
3944b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3954b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3970068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
3980068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
3990068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
4000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
4010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
4020068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
4030068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
4040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
4050068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
4060068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
4074870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
4084870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
4094870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
4104870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
4114870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
4124870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
413ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
414ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
415ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
416ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
417ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
418ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
419ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
420ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
421ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
422ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
423ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
424ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
425ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
426ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
427099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
428099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
429099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
430099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
431099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
432099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
433099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
434fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
435fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
436fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
437fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
438235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.SYNC_STATE_CHANGED, uid, null, name,
439235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.SYNC_STATE_CHANGED__STATE__ON);
440fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
441fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
442fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
443fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
444fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
445fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
446fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
447235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.SYNC_STATE_CHANGED, uid, null, name,
448235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.SYNC_STATE_CHANGED__STATE__OFF);
449fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
450fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
451fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
452fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
453fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
454fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
455fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
456235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, uid, null,
457235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__STARTED,
458235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    JobProtoEnums.STOP_REASON_UNKNOWN);
459fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
460fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
461fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
46294326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn    public void noteJobFinish(String name, int uid, int stopReason) {
463fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
464fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
46594326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn            mStats.noteJobFinishLocked(name, uid, stopReason);
466235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.SCHEDULED_JOB_STATE_CHANGED, uid, null,
467235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    name, StatsLog.SCHEDULED_JOB_STATE_CHANGED__STATE__FINISHED,
468235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    stopReason);
469fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
470fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
471fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
472977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani    void noteJobsDeferred(int uid, int numDeferred, long sinceLast) {
473977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani        // No need to enforce calling permission, as it is called from an internal interface
474977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani        synchronized (mStats) {
475977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani            mStats.noteJobsDeferredLocked(uid, numDeferred, sinceLast);
476977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani        }
477977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani    }
478977e11f335ffd02d60bbefb4fd1257b40783201aAmith Yamasani
479695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath    public void noteWakupAlarm(String name, int uid, WorkSource workSource, String tag) {
4801e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4811e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
482695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath            mStats.noteWakupAlarmLocked(name, uid, workSource, tag);
4831e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4841e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4851e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
486695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath    public void noteAlarmStart(String name, WorkSource workSource, int uid) {
4871e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4881e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
489695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath            mStats.noteAlarmStartLocked(name, workSource, uid);
490695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath        }
491695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath    }
492695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath
493695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath    public void noteAlarmFinish(String name, WorkSource workSource, int uid) {
494695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath        enforceCallingPermission();
495695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath        synchronized (mStats) {
496695cf72f26638f051d356abcb4acdc0c1fe3918dNarayan Kamath            mStats.noteAlarmFinishLocked(name, workSource, uid);
4971e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4981e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4991e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
500a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
5013d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5048182202ac884331a8f0a8d5094d5aad7d9323c08Narayan Kamath            mStats.noteStartWakeLocked(uid, pid, null, name, historyName, type,
5058182202ac884331a8f0a8d5094d5aad7d9323c08Narayan Kamath                    unimportantForLogging, SystemClock.elapsedRealtime(),
5068182202ac884331a8f0a8d5094d5aad7d9323c08Narayan Kamath                    SystemClock.uptimeMillis());
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
510cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5138182202ac884331a8f0a8d5094d5aad7d9323c08Narayan Kamath            mStats.noteStopWakeLocked(uid, pid, null, name, historyName, type,
514cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
518a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
519a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
5207e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
5217e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
522a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
523a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
5247e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
5257e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
5267e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
527cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
528cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
529e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
530e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
531e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
532cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
533e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
534e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
535e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
536e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
537cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
538cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
5397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
5407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
541cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
5427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
5437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
5447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
54596a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath    @Override
546d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockStart(String name, String historyName, int uid) {
547d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
548d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
549d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockStart(name, historyName, uid);
550d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
551d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
552d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
55396a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath    @Override
55496a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath    public void noteLongPartialWakelockStartFromSource(String name, String historyName,
55596a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath            WorkSource workSource) {
55696a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath        enforceCallingPermission();
55796a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath        synchronized (mStats) {
55896a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath            mStats.noteLongPartialWakelockStartFromSource(name, historyName, workSource);
55996a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath        }
56096a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath    }
56196a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath
56296a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath    @Override
563d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockFinish(String name, String historyName, int uid) {
564d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
565d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
566d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockFinish(name, historyName, uid);
567d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
568d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
569d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
57096a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath    @Override
57196a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath    public void noteLongPartialWakelockFinishFromSource(String name, String historyName,
57296a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath            WorkSource workSource) {
57396a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath        enforceCallingPermission();
57496a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath        synchronized (mStats) {
57596a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath            mStats.noteLongPartialWakelockFinishFromSource(name, historyName, workSource);
57696a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath        }
57796a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath    }
57896a9256fd81857c00bb014b8e00f7d552a0ed50aNarayan Kamath
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5829adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
583235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.SENSOR_STATE_CHANGED, uid, null, sensor,
584235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.SENSOR_STATE_CHANGED__STATE__ON);
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
58729fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5919adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
592235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.SENSOR_STATE_CHANGED, uid, null,
593235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    sensor, StatsLog.SENSOR_STATE_CHANGED__STATE__OFF);
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
59629fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
597a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
598a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
599a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
600a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
601a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
602a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
603a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
604a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
605a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
606a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
607a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
608a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
609a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
610a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
61132684ddf3c4b377c6fd6dccd2119942c0afb04f5Narayan Kamath    @Override
61232684ddf3c4b377c6fd6dccd2119942c0afb04f5Narayan Kamath    public void noteGpsChanged(WorkSource oldWs, WorkSource newWs) {
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
61532684ddf3c4b377c6fd6dccd2119942c0afb04f5Narayan Kamath            mStats.noteGpsChangedLocked(oldWs, newWs);
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
61829fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
61978ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray    public void noteGpsSignalQuality(int signalLevel) {
62078ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray        synchronized (mStats) {
62178ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray            mStats.noteGpsSignalQualityLocked(signalLevel);
62278ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray        }
62378ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray    }
62478ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray
625e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
62782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteScreenState");
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
629d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen            StatsLog.write(StatsLog.SCREEN_STATE_CHANGED, state);
630d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
631d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen            mStats.noteScreenStateLocked(state);
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
63382ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteScreenState");
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
63529fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
636617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
637617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
638617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
639c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz            StatsLog.write(StatsLog.SCREEN_BRIGHTNESS_CHANGED, brightness);
640617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
641617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
642617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
643e03583e261227d76ec4dec3d4e9dc9488a0623ccyro
644e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
647e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
650e03583e261227d76ec4dec3d4e9dc9488a0623ccyro
651280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
652280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
653280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
654280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
655280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
656280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
657280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
658e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
659617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
660617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
661e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
662617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
663617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
664e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
6651e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
6661e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
6671e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
6681e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
6691e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
6701e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
6711e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
672fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi    public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
673e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
674b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        final boolean update;
675e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
67614ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid);
67714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
67814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski
67914ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        if (update) {
680b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("modem-data", BatteryExternalStatsWorker.UPDATE_RADIO);
681e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
682e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
683e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6902f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6972f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
698e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
699627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
700627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
701e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
702627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
703627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
7042f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
705627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
706627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
707627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
708627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
709627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
710627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
71132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
712f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
71332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
714e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
71532dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
716e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
71732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
71832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
71932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
72058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
721105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
722105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
72358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
724105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
725105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7262f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
72758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
728105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
729105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
73058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
731105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
732105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
733d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
734244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
735244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
736244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
737244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
738235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, uid, null,
739235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.AUDIO_STATE_CHANGED__STATE__ON);
740244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
741244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
742244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
743244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
744244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
745244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
746244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
747235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, uid, null,
748235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.AUDIO_STATE_CHANGED__STATE__OFF);
749244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
750244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
751244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
752244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
753244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
754244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
755244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
7565caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu            StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_STATE_CHANGED, uid, null,
7575caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu                    StatsLog.MEDIA_CODEC_STATE_CHANGED__STATE__ON);
758244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
759244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
760244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
761244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
762244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
763244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
764244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
7655caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu            StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_STATE_CHANGED, uid,
7665caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu                    null, StatsLog.MEDIA_CODEC_STATE_CHANGED__STATE__OFF);
767244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
768244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
769244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
77010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
77110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
77210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
77310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
774235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.AUDIO_STATE_CHANGED, -1, null,
775235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.AUDIO_STATE_CHANGED__STATE__RESET);
77610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
77710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
77810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
77910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
78010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
78110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
78210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
7835caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu            StatsLog.write_non_chained(StatsLog.MEDIA_CODEC_STATE_CHANGED, -1, null,
7845caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu                    StatsLog.MEDIA_CODEC_STATE_CHANGED__STATE__RESET);
78510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
78610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
78710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
7886d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
789abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
790abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
7916d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
792235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.FLASHLIGHT_STATE_CHANGED, uid, null,
793235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.FLASHLIGHT_STATE_CHANGED__STATE__ON);
794abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
795abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
796abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
7976d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
798abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
799abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
8006d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
801235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.FLASHLIGHT_STATE_CHANGED, uid, null,
802235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.FLASHLIGHT_STATE_CHANGED__STATE__OFF);
8036d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
8046d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
8056d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
8066d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
8076d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
80882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteStartCamera");
8096d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
8106d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
811235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.CAMERA_STATE_CHANGED, uid, null,
812235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.CAMERA_STATE_CHANGED__STATE__ON);
8136d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
81482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteStartCamera");
8156d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
8166d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
8176d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
8186d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
8196d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
8206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
821235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.CAMERA_STATE_CHANGED, uid, null,
822235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.CAMERA_STATE_CHANGED__STATE__OFF);
8236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
8246d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
8256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
8266d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
8276d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
8286d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
8296d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
830235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.CAMERA_STATE_CHANGED, -1, null,
831235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.CAMERA_STATE_CHANGED__STATE__RESET);
8326d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
8336d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
8346d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
8356d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
8366d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
8376d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
8386d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
839235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz            StatsLog.write_non_chained(StatsLog.FLASHLIGHT_STATE_CHANGED, -1, null,
840235343daec5c052fc20b7186967ff60b0a1a6df7Bookatz                    StatsLog.FLASHLIGHT_STATE_CHANGED__STATE__RESET);
841abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
842abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
843abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
844e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
8455f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) {
846e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
847e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
848e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
849e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
8500c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
851a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
85206f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
85306f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
85406f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
855b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                mWorker.scheduleSync("wifi-data: " + type, BatteryExternalStatsWorker.UPDATE_WIFI);
856a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
8575f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski            mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
8580c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
859e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
860e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
86158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
862d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
863d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
86458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
865d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
866d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
867d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
86858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
869d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
870d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
87158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
87258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
87358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
87458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
87558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
87658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
87758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
87858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
879d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
880d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
881d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
882ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
883ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
884ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
885ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
886ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
887ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
888ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
8893251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
8903251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
8913251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
8923251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
8933251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
8943251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
8953251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
8963251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
8973251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
8983251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
8993251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
9003251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
9013251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
9023251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
903105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
904105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
905105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
906105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
907105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
908105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
9092f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
910105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
911105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
912105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
913105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
914105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
915105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
9166ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
9176ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
918105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
919105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
9206ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
921105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
922105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
9236ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
9246ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
925105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
926105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
9276ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
928105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
929105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9315347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
9325347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
9335347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
9345347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
9355347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
9365347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
9375347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
9385347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
9395347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
9405347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
9415347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
9425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
9435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
9445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
9457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
9467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
9477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
9487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
9497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
9507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
9517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
9527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
9537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
9547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
9557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
9567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
9577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
9587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
9596ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
9607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
9617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
9626ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
9637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
9647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
9657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
9666ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
9677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
9687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
9696ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
9707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
9717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
9727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
973a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
974a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
975a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
976a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
977a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
978a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
979a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
980a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
981a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
982a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
983a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
984a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
985a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
986a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
9877a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
9884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
9891059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
9901059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
9914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
9921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
9931059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
9941059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
9957a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
9967a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
9977a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
998b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // During device boot, qtaguid isn't enabled until after the inital
999b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // loading of battery stats. Now that they're enabled, take our initial
1000b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // snapshot for future delta calculation.
1001b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleSync("network-stats-enabled",
1002b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                BatteryExternalStatsWorker.UPDATE_RADIO | BatteryExternalStatsWorker.UPDATE_WIFI);
10037a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
10047a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
10058ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
100608c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
10078ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
10088ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
100908c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
10108ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
10118ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
10128ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
10133accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn    public void notePackageInstalled(String pkgName, long versionCode) {
10148ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
10158ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
10168ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
10178ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
10188ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
10198ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
10208ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
10218ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
10228ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
10238ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
10248ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
10258ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
10268ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
10276771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
1028b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz    public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) {
10296771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
10309f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
1031b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz            mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized);
10329f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
10336771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
10346771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
10356771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
103694c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz    public void noteBleScanStopped(WorkSource ws, boolean isUnoptimized) {
10376771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
10389f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
103994c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz            mStats.noteBluetoothScanStoppedFromSourceLocked(ws, isUnoptimized);
10409f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
10419f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
10429f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
10439f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    @Override
10449f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public void noteResetBleScan() {
10459f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        enforceCallingPermission();
10469f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
10479f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteResetBluetoothScanLocked();
10489f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
1049956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    }
1050956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz
1051956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    @Override
10524ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz    public void noteBleScanResults(WorkSource ws, int numNewResults) {
1053956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        enforceCallingPermission();
1054956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        synchronized (mStats) {
10554ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz            mStats.noteBluetoothScanResultsFromSourceLocked(ws, numNewResults);
1056956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        }
10576771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
10586771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
1059010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
1060010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteWifiControllerActivity(WifiActivityEnergyInfo info) {
1061010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
1062010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1063010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
1064010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid wifi data given: " + info);
1065010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
1066010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
1067010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
106814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateWifiState(info);
1069010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
1070010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1071010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
1072010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) {
1073010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
1074010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
1075010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid bluetooth data given: " + info);
1076010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
1077010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
1078010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1079c357e68c0d59fdeb7ae046cea932844355319333Adam Lesinski        synchronized (mStats) {
1080c357e68c0d59fdeb7ae046cea932844355319333Adam Lesinski            mStats.updateBluetoothStateLocked(info);
1081c357e68c0d59fdeb7ae046cea932844355319333Adam Lesinski        }
1082010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
1083010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1084010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
1085010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteModemControllerActivity(ModemActivityInfo info) {
1086010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
1087010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
1088010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
1089010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid modem data given: " + info);
1090010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
1091010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
1092010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
109314ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateMobileRadioState(info);
1094010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
1095010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1100d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
1101d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
1102041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int level, final int temp, final int volt, final int chargeUAh,
1103041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int chargeFullUAh) {
1104d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
1105d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1106d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
1107d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
1108b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleRunnable(() -> {
1109b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            synchronized (mStats) {
1110c57729adaef25a48775d981836ae2e3484495a1fSudheer Shanka                final boolean onBattery = BatteryStatsImpl.isOnBattery(plugType, status);
1111b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                if (mStats.isOnBattery() == onBattery) {
1112b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // The battery state has not changed, so we don't need to sync external
1113b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // stats immediately.
1114b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1115b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                            chargeUAh, chargeFullUAh);
1116b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    return;
1117d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1118b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
1119d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1120b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Sync external stats first as the battery has changed states. If we don't sync
1121b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // before changing the state, we may not collect the relevant data later.
1122b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Order here is guaranteed since we're scheduling from the same thread and we are
1123b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // using a single threaded executor.
1124b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("battery-state", BatteryExternalStatsWorker.UPDATE_ALL);
1125b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleRunnable(() -> {
1126d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
1127926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1128041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski                            chargeUAh, chargeFullUAh);
1129d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1130b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            });
1131d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
1132633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
11332f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1153c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1154c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
1155515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
1156515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
1157515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
1158515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
1159c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1160c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
1161c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
1162c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1163c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1164c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
1165c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
1166c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1167515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
1168515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
1169515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
1170515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
1171515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
1172515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1173515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
1174515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
1175515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1176c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
1177515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
1178515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
1179c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
1180515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
1181c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1182c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
1183c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
1184c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
1185c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
1186c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1187515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1188515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
1189515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
1190515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
1191515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
1192515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1193515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
1194515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
1195515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
1196515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
1197515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
1198515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
1199515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1200515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
1201515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
1202515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1203515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
1204515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
1205515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
1206515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
1207515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1208515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
1209515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
1210515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
1211c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1212c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1213515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
1214c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1215ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
121691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
121771a9531806d9d37f5482c4d242f95416c04715bfKweku Adams        pw.println("  [--checkin] [--proto] [--history] [--history-start] [--charged] [-c]");
1218d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
1219865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
1220865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
12211476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato        pw.println("  -c: write the current stats in checkin format.");
122271a9531806d9d37f5482c4d242f95416c04715bfKweku Adams        pw.println("  --proto: write the current aggregate stats (without history) in proto format.");
1223099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
1224c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
1225c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
1226d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
1227ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
1228ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
1229d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
1230d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
12315c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka        pw.println("  --settings: dump the settings key/values related to batterystats");
1232234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma        pw.println("  --cpu: dump cpu stats for debugging purpose");
1233cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
1234fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
1235fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
1236fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
1237fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
1238fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
12390068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
12401e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
1241fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
1242674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        pw.println("      pretend-screen-off: pretend the screen is off, even if screen state changes");
1243ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1244ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
12455c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka    private void dumpSettings(PrintWriter pw) {
12465c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka        synchronized (mStats) {
12475c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka            mStats.dumpConstantsLocked(pw);
12485c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka        }
12495c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka    }
12505c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka
1251234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma    private void dumpCpuStats(PrintWriter pw) {
1252234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma        synchronized (mStats) {
1253234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma            mStats.dumpCpuStatsLocked(pw);
1254234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma        }
1255234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma    }
1256234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma
1257cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1258cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1259cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1260cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1261cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1262cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1263cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
12640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1265cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
12660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1267cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
12689a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
12699a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
12709a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
12719a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1272674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        } else if ("pretend-screen-off".equals(args[i])) {
1273674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            synchronized (mStats) {
1274674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani                mStats.setPretendScreenOff(enable);
1275674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            }
1276cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1277cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1278cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1279cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1280cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1281cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1282cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1283cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
12844b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
12876df866a8510af2776c48425a361f708ae7f5d7d6Jeff Sharkey        if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
12883abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1289c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
12900068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
12912f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams        boolean toProto = false;
12920068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
12930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
129416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
1295c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
1296cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
1297e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
1298c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
1299c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
1300e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
13010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
13020068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
1303099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
1304c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1305c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
1306c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1307c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
1308c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
1309c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
1310c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
1311c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
1312c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1313c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
131416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
131549021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
13160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
1317c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
13182f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                } else if ("--proto".equals(arg)) {
13192f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    toProto = true;
1320c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1321c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1322d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1323d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1324e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1325e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
13263d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1327e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
13280ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1330b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL);
13310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
1332b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka                    syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL);
13330ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
13340ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
13350ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
13360ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
13370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1338d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1339d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1340d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1341d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1342d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1343d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1344d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1345d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1346d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1347d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1348d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1349d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1350fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1351cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1352cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1353cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1354cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1355cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1356cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1357fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1358cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1359cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1360cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1361cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1362cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1363cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1364ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1365ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1366ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
13675c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka                } else if ("--settings".equals(arg)) {
13685c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka                    dumpSettings(pw);
13695c19b897ddb89481c5981195d2470f6ce5de4b1cSudheer Shanka                    return;
1370234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma                } else if ("--cpu".equals(arg)) {
1371234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma                    dumpCpuStats(pw);
1372234d1828ca4a706676ad6f3fa0629959c74297c7Mike Ma                    return;
1373e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1374a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1375cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
13760ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1377ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1378cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1379cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1380cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1381cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1382e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey                        reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
1383cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1384cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1385cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1386cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1387cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1388cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1391e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
13920ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
13930ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
13940ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
139513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
139613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
139713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
139813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
139913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
140013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
140113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
1402b2f83c16d6669456b237970327ebb9c92a4789f0Sudheer Shanka            syncStats("dump", BatteryExternalStatsWorker.UPDATE_ALL);
140313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
140413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1405d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
140613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1407ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1408ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1409ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
14101e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1411ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1412ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1413ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1414ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1415ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
14164b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
14172f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams        if (toProto) {
14182f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
14192f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
14202f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            if (isRealCheckin) {
14212f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                // For a real checkin, first we want to prefer to use the last complete checkin
14222f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                // file if there is one.
14232f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                synchronized (mStats.mCheckinFile) {
14242f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    if (mStats.mCheckinFile.exists()) {
14252f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                        try {
14262f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            byte[] raw = mStats.mCheckinFile.readFully();
14272f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            if (raw != null) {
14282f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                Parcel in = Parcel.obtain();
14292f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                in.unmarshall(raw, 0, raw.length);
14302f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                in.setDataPosition(0);
14312f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
14322f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                        null, mStats.mHandler, null, mUserManagerUserInfoProvider);
14332f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                checkinStats.readSummaryFromParcel(in);
14342f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                in.recycle();
143571a9531806d9d37f5482c4d242f95416c04715bfKweku Adams                                checkinStats.dumpProtoLocked(
143671a9531806d9d37f5482c4d242f95416c04715bfKweku Adams                                        mContext, fd, apps, flags, historyStart);
14372f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                mStats.mCheckinFile.delete();
14382f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                return;
14392f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            }
14402f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                        } catch (IOException | ParcelFormatException e) {
14412f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            Slog.w(TAG, "Failure reading checkin file "
14422f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                    + mStats.mCheckinFile.getBaseFile(), e);
14432f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                        }
14442f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    }
14452f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                }
14462f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            }
14472f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            if (DBG) Slog.d(TAG, "begin dumpProtoLocked from UID " + Binder.getCallingUid());
14482f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            synchronized (mStats) {
144971a9531806d9d37f5482c4d242f95416c04715bfKweku Adams                mStats.dumpProtoLocked(mContext, fd, apps, flags, historyStart);
14502f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                if (writeData) {
14512f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    mStats.writeAsyncLocked();
14522f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                }
14532f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            }
14542f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            if (DBG) Slog.d(TAG, "end dumpProtoLocked");
14552f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams        } else if (useCheckinFormat) {
14569cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
14570d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
14580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
14590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
14600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
14610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
14620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
14630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
14640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
14650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
14660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
14670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
14680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
14690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
1470e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                                        null, mStats.mHandler, null, mUserManagerUserInfoProvider);
14710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
14720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
14730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
14740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
14750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
14760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
14770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
14789ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
14790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
14800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
14810068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
14820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
14830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
14840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
148582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
1486e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1487c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
148816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
148916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
149016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1491e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
149282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpCheckinLocked");
1493e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
149482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
1495e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1496c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
149716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
149816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
149916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1500e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
150182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpLocked");
15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15044b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1505713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1506a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray     * Gets a snapshot of cellular stats
1507a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray     * @hide
1508a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray     */
1509a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray    public CellularBatteryStats getCellularBatteryStats() {
1510a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray        synchronized (mStats) {
1511a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray            return mStats.getCellularBatteryStats();
1512a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray        }
1513a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray    }
1514a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray
1515a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray    /**
1516b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray     * Gets a snapshot of Wifi stats
1517b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray     * @hide
1518b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray     */
1519b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray    public WifiBatteryStats getWifiBatteryStats() {
1520b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray        synchronized (mStats) {
1521b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray            return mStats.getWifiBatteryStats();
1522b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray        }
1523b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray    }
1524b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray
1525b50a684ba8310a7d9b9738f9304b029268dedd64Siddharth Ray    /**
152678ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray     * Gets a snapshot of Gps stats
152778ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray     * @hide
152878ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray     */
152978ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray    public GpsBatteryStats getGpsBatteryStats() {
153078ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray        synchronized (mStats) {
153178ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray            return mStats.getGpsBatteryStats();
153278ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray        }
153378ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray    }
153478ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray
153578ccaf5d287cbb6bd214913d72653aa74ecfef76Siddharth Ray    /**
1536713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a particular uid.
1537713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1538713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1539713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler takeUidSnapshot(int requestUid) {
1540713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (requestUid != Binder.getCallingUid()) {
1541713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1542713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1543713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1544713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1545713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1546e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka            if (shouldCollectExternalStats()) {
1547e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka                syncStats("get-health-stats-for-uids", BatteryExternalStatsWorker.UPDATE_ALL);
1548e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka            }
1549713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1550713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return getHealthStatsForUidLocked(requestUid);
1551713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1552713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
155382ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
1554713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1555713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1556713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1557713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1558713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1559713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1560713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1561713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a number of uids.
1562713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1563713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1564713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) {
1565713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (!onlyCaller(requestUids)) {
1566713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1567713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1568713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1569713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1570713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        int i=-1;
1571713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1572e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka            if (shouldCollectExternalStats()) {
1573e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka                syncStats("get-health-stats-for-uids", BatteryExternalStatsWorker.UPDATE_ALL);
1574e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka            }
1575713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1576713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final int N = requestUids.length;
1577713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final HealthStatsParceler[] results = new HealthStatsParceler[N];
1578713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                for (i=0; i<N; i++) {
1579713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    results[i] = getHealthStatsForUidLocked(requestUids[i]);
1580713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                }
1581713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return results;
1582713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1583713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
158482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
1585713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    + Arrays.toString(requestUids) + ") i=" + i, ex);
1586713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1587713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1588713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1589713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1590713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1591e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka
1592e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka    private boolean shouldCollectExternalStats() {
1593e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka        return (SystemClock.elapsedRealtime() - mWorker.getLastCollectionTimeStamp())
1594e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka                > mStats.getExternalStatsCollectionRateLimitMs();
1595e56013aa312608c4cd7ea12d5bab1594534b137eSudheer Shanka    }
1596713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1597713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1598713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Returns whether the Binder.getCallingUid is the only thing in requestUids.
1599713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1600713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    private static boolean onlyCaller(int[] requestUids) {
1601713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int caller = Binder.getCallingUid();
1602713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int N = requestUids.length;
1603713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        for (int i=0; i<N; i++) {
1604713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            if (requestUids[i] != caller) {
1605713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return false;
1606713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1607713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1608713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return true;
1609713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1610713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1611713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1612713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a HealthStatsParceler for the given uid. You should probably call
1613010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * updateExternalStatsSync first.
1614713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1615713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    HealthStatsParceler getHealthStatsForUidLocked(int requestUid) {
1616713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter();
1617713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS);
1618713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid);
1619713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (uid != null) {
1620713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            writer.writeUid(uidWriter, mStats, uid);
1621713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1622713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return new HealthStatsParceler(uidWriter);
1623713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1624713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1626