BatteryStatsService.java revision d54f9dd6251c7bd7033630b7afa770190d41c409
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context;
21e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo;
223abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager;
234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo;
24455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.os.PowerSaveState;
2591268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder;
276f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel;
300068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor;
319ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException;
32cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager;
35e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock;
36cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle;
37e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shuklaimport android.os.UserManagerInternal;
387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
39713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler;
40713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter;
41713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats;
4206f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
4321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo;
44e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
45e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
468a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
47674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani
4832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
49d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
5032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
51e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
5250df711a5125460acb8d2960ffc0a1f17a818103Bookatzimport com.android.internal.os.RpmStats;
53fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeyimport com.android.internal.util.DumpUtils;
54cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
55455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport com.android.server.power.BatterySaverPolicy.ServiceType;
567ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yuimport android.util.StatsLog;
5732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
62515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
63515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
64515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
65515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
66515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
67713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays;
68e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
69b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.ExecutionException;
70b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.Future;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
76cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
7768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        implements PowerManagerInternal.LowPowerModeListener,
7868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        BatteryStatsImpl.PlatformIdleStateCallback {
79c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
8082ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato    static final boolean DBG = false;
81c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
82010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static IBatteryStats sService;
83010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
85e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider;
86b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final Context mContext;
87b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final BatteryExternalStatsWorker mWorker;
884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
8950df711a5125460acb8d2960ffc0a1f17a818103Bookatz    private native void getLowPowerStats(RpmStats rpmStats);
9068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
91d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    private native int getSubsystemLowPowerStats(ByteBuffer outBuffer);
9268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
9368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .newDecoder()
9468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onMalformedInput(CodingErrorAction.REPLACE)
9568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
9668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .replaceWith("?");
9768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE);
9868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE);
9968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private static final int MAX_LOW_POWER_STATS_SIZE = 512;
10068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
10150df711a5125460acb8d2960ffc0a1f17a818103Bookatz    /**
10250df711a5125460acb8d2960ffc0a1f17a818103Bookatz     * Replaces the information in the given rpmStats with up-to-date information.
10350df711a5125460acb8d2960ffc0a1f17a818103Bookatz     */
10450df711a5125460acb8d2960ffc0a1f17a818103Bookatz    @Override
10550df711a5125460acb8d2960ffc0a1f17a818103Bookatz    public void fillLowPowerStats(RpmStats rpmStats) {
10650df711a5125460acb8d2960ffc0a1f17a818103Bookatz        if (DBG) Slog.d(TAG, "begin getLowPowerStats");
10750df711a5125460acb8d2960ffc0a1f17a818103Bookatz        try {
10850df711a5125460acb8d2960ffc0a1f17a818103Bookatz            getLowPowerStats(rpmStats);
10950df711a5125460acb8d2960ffc0a1f17a818103Bookatz        } finally {
11050df711a5125460acb8d2960ffc0a1f17a818103Bookatz            if (DBG) Slog.d(TAG, "end getLowPowerStats");
11150df711a5125460acb8d2960ffc0a1f17a818103Bookatz        }
11250df711a5125460acb8d2960ffc0a1f17a818103Bookatz    }
11350df711a5125460acb8d2960ffc0a1f17a818103Bookatz
11468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    @Override
11568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    public String getPlatformLowPowerStats() {
11682ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
117cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        try {
118cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.clear();
119cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.clear();
120cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.reset();
121cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat);
122cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            if (bytesWritten < 0) {
123cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return null;
124cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            } else if (bytesWritten == 0) {
125cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return "Empty";
126cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            }
127cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.limit(bytesWritten);
128cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
129cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.flip();
130cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            return mUtf16BufferStat.toString();
131cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        } finally {
13282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats");
13368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        }
13468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    }
13568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
136d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    @Override
137d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    public String getSubsystemLowPowerStats() {
13850df711a5125460acb8d2960ffc0a1f17a818103Bookatz        if (DBG) Slog.d(TAG, "begin getSubsystemLowPowerStats");
139d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        try {
140d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.clear();
141d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.clear();
142d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.reset();
143d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            int bytesWritten = getSubsystemLowPowerStats(mUtf8BufferStat);
144d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            if (bytesWritten < 0) {
145d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return null;
146d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            } else if (bytesWritten == 0) {
147d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return "Empty";
148d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            }
149d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.limit(bytesWritten);
150d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
151d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.flip();
152d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            return mUtf16BufferStat.toString();
153d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        } finally {
15450df711a5125460acb8d2960ffc0a1f17a818103Bookatz            if (DBG) Slog.d(TAG, "end getSubsystemLowPowerStats");
155d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        }
156d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    }
157d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy
158b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    BatteryStatsService(Context context, File systemDir, Handler handler) {
1594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
160b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mContext = context;
161e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() {
162e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            private UserManagerInternal umi;
163e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            @Override
164e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            public int[] getUserIds() {
165e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                if (umi == null) {
166e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                    umi = LocalServices.getService(UserManagerInternal.class);
167e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                }
168e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                return (umi != null) ? umi.getUserIds() : null;
169e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            }
170e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        };
171e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        mStats = new BatteryStatsImpl(systemDir, handler, this, mUserManagerUserInfoProvider);
172b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker = new BatteryExternalStatsWorker(context, mStats);
173b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setExternalStatsSyncLocked(mWorker);
174b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
175b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);
176b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setPowerProfileLocked(new PowerProfile(context));
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
17868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
179b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    public void publish() {
1806832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
1812c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1822c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
183b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private static void awaitUninterruptibly(Future<?> future) {
184b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        while (true) {
185b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            try {
186b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                future.get();
187b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
188b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (ExecutionException e) {
189b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
190b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (InterruptedException e) {
191b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                // Keep looping
192b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
193b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        }
194b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    }
195b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
1962c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
1972c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
1982c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
1992c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
2002c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
201010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
202010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        powerMgr.registerLowPowerModeObserver(this);
20314ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        synchronized (mStats) {
20414ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(
20514ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                    powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
20614ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                            .batterySaverEnabled);
20714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
208c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
2092c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
2102c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
21155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
2128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
2134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
214b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("shutdown", BatteryExternalStatsWorker.UPDATE_ALL));
215b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
21655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
2176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
21855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
21920b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski
22020b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        // Shutdown the thread we made.
221b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.shutdown();
22255280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
2232f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
22891268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
232cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
233cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
234455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public int getServiceType() {
235455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei        return ServiceType.BATTERY_STATS;
236455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
237455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
238455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    @Override
239455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public void onLowPowerModeChanged(PowerSaveState result) {
240cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
24114ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(result.batterySaverEnabled);
242cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
243cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
244cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
259b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleWrite();
2604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2622f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
2632f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
264b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
265b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
266b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
267b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
268b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
269b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
270b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
271b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
272b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
273e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    void onCleanupUser(int userId) {
274e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        synchronized (mStats) {
275e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            mStats.onCleanupUserLocked(userId);
276e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        }
277e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    }
278e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla
279e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    void onUserRemoved(int userId) {
280e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        synchronized (mStats) {
281e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            mStats.onUserRemovedLocked(userId);
282e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        }
283e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    }
284e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla
2852f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
2862f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2872f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
2882f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2892f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2902f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2912f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
2922f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
29361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
2942f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2972f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
2982f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2992f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
3002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3022f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3031e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
3041e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3051e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
3061e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3071e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3081e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
3091e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
3101e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3111e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
3121e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3141e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
315a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteProcessFinish(String name, int uid) {
3162f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
317a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
3182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3192f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3202f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
321a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteUidProcessState(int uid, int state) {
3222f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
323d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen            // TODO: remove this once we figure out properly where and how
324d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen            StatsLog.write(StatsLog.PROCESS_STATE_CHANGED, uid, state);
325d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
326a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteUidProcessStateLocked(uid, state);
3272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3282f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3292f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3302f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
3312f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
3358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
3368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
338b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL));
3394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
3480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
3490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
3500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
3510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
353b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL));
3544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
3580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
3590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
3600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
3610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
3620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
3630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
3640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
3660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3674870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
3684870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
3694870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
3704870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
3714870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
3724870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
373ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
374ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
375ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
376ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
377ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
378ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
379ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
380ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
381ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
382ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
383ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
384ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
385ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
386ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
387099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
388099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
389099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
390099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
391099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
392099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
393099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
394fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
395fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
396fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
397fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
398fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
399fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
400fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
401fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
402fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
403fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
404fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
405fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
406fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
407fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
408fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
409fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
410fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
411fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
412fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
413fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
414fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
41594326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn    public void noteJobFinish(String name, int uid, int stopReason) {
416fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
41894326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn            mStats.noteJobFinishLocked(name, uid, stopReason);
419fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
420fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
421fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
4221e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
4231e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4241e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
4251e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
4261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4271e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
4291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
4301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
4321e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
4331e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4341e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4351e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
436a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
4373d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
440e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
44140c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
445cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
448cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
449cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
453a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
454a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
4557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
457a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
458a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
4597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
462cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
463cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
464e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
465e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
466e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
467cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
468e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
469e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
470e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
471e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
472cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
473cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
4747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
476cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
4777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
480d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockStart(String name, String historyName, int uid) {
481d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
482d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
483d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockStart(name, historyName, uid);
484d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
485d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
486d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
487d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockFinish(String name, String historyName, int uid) {
488d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
489d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
490d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockFinish(name, historyName, uid);
491d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
492d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
493d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50029fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50729fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
508a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
509a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
510a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
511a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
512a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
513a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
514a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
515a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
516a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
517a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
518a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
519a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
520a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
521a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52829fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53529fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
536e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
53882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteScreenState");
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
540931945399859ab91545ba2c2a914f044092d5e2eJoe Onorato            // TODO: remove this once we figure out properly where and how
541d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen            StatsLog.write(StatsLog.SCREEN_STATE_CHANGED, state);
542d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen
543d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen            mStats.noteScreenStateLocked(state);
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteScreenState");
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54729fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
548617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
549617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
550617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
551617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
552617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
553617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
554e03583e261227d76ec4dec3d4e9dc9488a0623ccyro
555e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
558e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
561e03583e261227d76ec4dec3d4e9dc9488a0623ccyro
562280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
563280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
564280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
565280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
566280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
567280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
568280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
569e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
570617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
572e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
573617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
574617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
575e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5761e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
5771e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
5781e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
5791e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
5801e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
5811e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
5821e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
583fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi    public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
584e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
585b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        final boolean update;
586e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
58714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid);
58814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
58914ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski
59014ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        if (update) {
591b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("modem-data", BatteryExternalStatsWorker.UPDATE_RADIO);
592e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
593e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
594e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6012f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6082f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
609e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
610627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
611627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
612e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
613627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
614627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
6152f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
616627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
619627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
620627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
621627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
62232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
623f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
62432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
625e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
62632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
627e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
62832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
62932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
63032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
63158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
632105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
63458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
635105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
636105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
6372f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
63858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
640105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
64158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
642105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
643105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
644d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
650244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
651244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
652244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
653244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
654244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
655244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
656244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
657244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
658244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
659244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
660244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
661244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
662244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
663244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
664244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
665244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
666244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
667244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
668244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
669244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
670244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
671244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
672244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
67310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
67410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
67510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
67610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
67710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
67810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
67910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
68010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
68110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
68210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
68310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
68410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
68510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
68610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
6876d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
688abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
689abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6906d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
691abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
692abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
693abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
6946d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
695abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
696abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6976d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
6986d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6996d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7006d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7016d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
7026d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
70382ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteStartCamera");
7046d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7056d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
7066d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
70782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteStartCamera");
7086d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7096d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7106d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
7116d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7126d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7136d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
7146d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7156d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7166d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7176d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
7186d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7196d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
7216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7246d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
7256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7266d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7276d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
728abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
729abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
730abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
731e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
7325f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) {
733e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
734e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
735e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
736e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
7370c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
738a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
73906f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
74006f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
74106f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
742b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                mWorker.scheduleSync("wifi-data: " + type, BatteryExternalStatsWorker.UPDATE_WIFI);
743a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
7445f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski            mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
7450c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
746e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
747e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
74858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
749d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
750d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
75158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
752d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
753d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
754d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
75558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
756d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
757d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
75858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
75958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
76058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
76158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
76258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
76358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
76458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
76558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
766d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
767d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
768d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
769ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
770ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
771ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
772ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
773ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
774ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
775ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
7763251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
7773251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7783251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7793251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
7803251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7813251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7823251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7833251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
7843251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7853251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7863251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
7873251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7883251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7893251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
793105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
794105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7962f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
797105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
798105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
799105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
800105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
801105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
802105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8036ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8046ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
805105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
806105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8076ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8106ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8116ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
813105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8146ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
815105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
8195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
8225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
8265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8285347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
8295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8315347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
8337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
8367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
8407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
8437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8466ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
8477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8496ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
8507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8536ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
8547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8566ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
8577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
860a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
861a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
862a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
863a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
864a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
865a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
866a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
867a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
868a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
869a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
870a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
871a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
872a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
873a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
8747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
8757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
8787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
8827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
8837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
8867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8897a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
8911059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
8921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
8934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
8941059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
8951059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
8961059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
8977a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8987a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
8997a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
900b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // During device boot, qtaguid isn't enabled until after the inital
901b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // loading of battery stats. Now that they're enabled, take our initial
902b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // snapshot for future delta calculation.
903b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleSync("network-stats-enabled",
904b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                BatteryExternalStatsWorker.UPDATE_RADIO | BatteryExternalStatsWorker.UPDATE_WIFI);
9057a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
9067a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
9078ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
90808c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
9098ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9108ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
91108c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
9128ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9138ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9148ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9158ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
9168ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9178ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9188ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
9198ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9208ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9218ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9228ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
9238ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9248ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9258ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
9268ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9278ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9288ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9296771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
930b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz    public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) {
9316771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9329f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
933b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz            mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized);
9349f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9356771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9366771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
9376771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
93894c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz    public void noteBleScanStopped(WorkSource ws, boolean isUnoptimized) {
9396771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9409f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
94194c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz            mStats.noteBluetoothScanStoppedFromSourceLocked(ws, isUnoptimized);
9429f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9439f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
9449f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
9459f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    @Override
9469f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public void noteResetBleScan() {
9479f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        enforceCallingPermission();
9489f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9499f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteResetBluetoothScanLocked();
9509f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
951956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    }
952956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz
953956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    @Override
9544ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz    public void noteBleScanResults(WorkSource ws, int numNewResults) {
955956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        enforceCallingPermission();
956956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        synchronized (mStats) {
9574ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz            mStats.noteBluetoothScanResultsFromSourceLocked(ws, numNewResults);
958956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        }
9596771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9606771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
961010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
962010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteWifiControllerActivity(WifiActivityEnergyInfo info) {
963010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
964010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
965010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
966010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid wifi data given: " + info);
967010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
968010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
969010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
97014ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateWifiState(info);
971010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
972010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
973010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
974010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) {
975010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
976010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
977010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid bluetooth data given: " + info);
978010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
979010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
980010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
981b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.updateBluetoothStateLocked(info);
982010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
983010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
984010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
985010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteModemControllerActivity(ModemActivityInfo info) {
986010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
987010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
988010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
989010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid modem data given: " + info);
990010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
991010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
992010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
99314ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateMobileRadioState(info);
994010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
995010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1000d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
1001d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
1002041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int level, final int temp, final int volt, final int chargeUAh,
1003041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int chargeFullUAh) {
1004d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
1005d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1006d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
1007d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
1008b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleRunnable(() -> {
1009b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            synchronized (mStats) {
1010b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
1011b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                if (mStats.isOnBattery() == onBattery) {
1012b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // The battery state has not changed, so we don't need to sync external
1013b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // stats immediately.
1014b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1015b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                            chargeUAh, chargeFullUAh);
1016b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    return;
1017d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1018b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
1019d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1020b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Sync external stats first as the battery has changed states. If we don't sync
1021b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // before changing the state, we may not collect the relevant data later.
1022b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Order here is guaranteed since we're scheduling from the same thread and we are
1023b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // using a single threaded executor.
1024b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("battery-state", BatteryExternalStatsWorker.UPDATE_ALL);
1025b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleRunnable(() -> {
1026d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
1027926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1028041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski                            chargeUAh, chargeFullUAh);
1029d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1030b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            });
1031d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
1032633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
10332f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1053c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1054c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
1055515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
1056515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
1057515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
1058515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
1059c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1060c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
1061c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
1062c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1063c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1064c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
1065c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
1066c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1067515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
1068515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
1069515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
1070515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
1071515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
1072515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1073515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
1074515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
1075515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1076c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
1077515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
1078515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
1079c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
1080515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
1081c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1082c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
1083c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
1084c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
1085c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
1086c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1087515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1088515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
1089515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
1090515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
1091515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
1092515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1093515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
1094515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
1095515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
1096515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
1097515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
1098515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
1099515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1100515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
1101515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
1102515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1103515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
1104515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
1105515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
1106515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
1107515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1108515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
1109515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
1110515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
1111c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1112c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1113515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
1114c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1115ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
111691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
11171e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
1118d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
1119865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
1120865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
11211476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato        pw.println("  -c: write the current stats in checkin format.");
1122099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
1123c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
1124c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
1125d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
1126ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
1127ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
1128d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
1129d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
1130cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
1131fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
1132fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
1133fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
1134fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
1135fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
11360068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
11371e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
1138fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
1139674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        pw.println("      pretend-screen-off: pretend the screen is off, even if screen state changes");
1140ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1141ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1142cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1143cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1144cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1145cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1146cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1147cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1148cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
11490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1150cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
11510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1152cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
11539a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
11549a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
11559a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
11569a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1157674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        } else if ("pretend-screen-off".equals(args[i])) {
1158674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            synchronized (mStats) {
1159674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani                mStats.setPretendScreenOff(enable);
1160674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            }
1161cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1162cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1163cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1164cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1165cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1166cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1167cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1168cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
11694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
11726df866a8510af2776c48425a361f708ae7f5d7d6Jeff Sharkey        if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
11733abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1174c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
11750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
11762f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams        boolean toProto = false;
11770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
11780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
117916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
1180c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
1181cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
1182e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
1183c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
1184c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
1185e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
11860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
11870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
1188099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
1189c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1190c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
1191c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1192c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
1193c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
1194c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
1195c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
1196c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
1197c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1198c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
119916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
120049021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
12010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
1202c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
12032f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                } else if ("--proto".equals(arg)) {
12042f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    toProto = true;
1205c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1206c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1207d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1208d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1209e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1210e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
12113d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1212e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
12130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1215b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL);
12160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
1217b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    awaitUninterruptibly(mWorker.scheduleSync("dump",
1218b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                            BatteryExternalStatsWorker.UPDATE_ALL));
12190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
12200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
12210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
12220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1224d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1225d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1226d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1227d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1228d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1229d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1230d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1231d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1232d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1233d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1234d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1235d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1236fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1237cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1238cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1239cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1240cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1241cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1242cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1243fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1244cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1245cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1246cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1247cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1248cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1249cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1250ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1251ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1252ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1253e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1254a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1255cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
12560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1257ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1258cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1259cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1260cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1261cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1262e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey                        reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
1263cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1264cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1265cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1266cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1267cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1268cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1271e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
12720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
12730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
127513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
127613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
127713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
127813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
127913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
128013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
128113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
1282b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL));
128313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
128413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1285d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
128613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1287ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1288ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1289ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
12901e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1291ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1292ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1293ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1294ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1295ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
12964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12972f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams        if (toProto) {
12982f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
12992f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
13002f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            if (isRealCheckin) {
13012f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                // For a real checkin, first we want to prefer to use the last complete checkin
13022f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                // file if there is one.
13032f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                synchronized (mStats.mCheckinFile) {
13042f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    if (mStats.mCheckinFile.exists()) {
13052f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                        try {
13062f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            byte[] raw = mStats.mCheckinFile.readFully();
13072f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            if (raw != null) {
13082f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                Parcel in = Parcel.obtain();
13092f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                in.unmarshall(raw, 0, raw.length);
13102f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                in.setDataPosition(0);
13112f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
13122f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                        null, mStats.mHandler, null, mUserManagerUserInfoProvider);
13132f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                checkinStats.readSummaryFromParcel(in);
13142f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                in.recycle();
13152f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                checkinStats.dumpProtoLocked(mContext, fd, apps, flags,
13162f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                        historyStart);
13172f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                mStats.mCheckinFile.delete();
13182f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                return;
13192f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            }
13202f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                        } catch (IOException | ParcelFormatException e) {
13212f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                            Slog.w(TAG, "Failure reading checkin file "
13222f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                                    + mStats.mCheckinFile.getBaseFile(), e);
13232f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                        }
13242f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    }
13252f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                }
13262f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            }
13272f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            if (DBG) Slog.d(TAG, "begin dumpProtoLocked from UID " + Binder.getCallingUid());
13282f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            synchronized (mStats) {
13292f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                mStats.dumpProtoLocked(mContext, fd, apps, flags, historyStart);
13302f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                if (writeData) {
13312f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                    mStats.writeAsyncLocked();
13322f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams                }
13332f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            }
13342f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams            if (DBG) Slog.d(TAG, "end dumpProtoLocked");
13352f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams        } else if (useCheckinFormat) {
13369cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
13370d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
13380068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
13390068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
13400068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
13410068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
13420068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
13430068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
13440068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
13450068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
13460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
13470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
13480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
13490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
1350e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                                        null, mStats.mHandler, null, mUserManagerUserInfoProvider);
13510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
13520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
13530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
13540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
13550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
13560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
13570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
13589ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
13590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
13600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
13610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
13620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
13630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
13640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
136582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
1366e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1367c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
136816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
136916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
137016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1371e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
137282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpCheckinLocked");
1373e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
137482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
1375e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1376c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
137716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
137816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
137916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1380e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
138182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpLocked");
13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13844b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1385713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1386713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a particular uid.
1387713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1388713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1389713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler takeUidSnapshot(int requestUid) {
1390713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (requestUid != Binder.getCallingUid()) {
1391713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1392713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1393713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1394713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1395713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1396b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
1397b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    BatteryExternalStatsWorker.UPDATE_ALL));
1398713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1399713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return getHealthStatsForUidLocked(requestUid);
1400713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1401713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
140282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
1403713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1404713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1405713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1406713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1407713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1408713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1409713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1410713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a number of uids.
1411713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1412713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1413713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) {
1414713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (!onlyCaller(requestUids)) {
1415713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1416713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1417713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1418713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1419713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        int i=-1;
1420713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1421b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
1422b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    BatteryExternalStatsWorker.UPDATE_ALL));
1423713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1424713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final int N = requestUids.length;
1425713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final HealthStatsParceler[] results = new HealthStatsParceler[N];
1426713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                for (i=0; i<N; i++) {
1427713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    results[i] = getHealthStatsForUidLocked(requestUids[i]);
1428713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                }
1429713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return results;
1430713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1431713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
143282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
1433713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    + Arrays.toString(requestUids) + ") i=" + i, ex);
1434713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1435713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1436713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1437713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1438713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1439713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1440713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1441713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Returns whether the Binder.getCallingUid is the only thing in requestUids.
1442713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1443713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    private static boolean onlyCaller(int[] requestUids) {
1444713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int caller = Binder.getCallingUid();
1445713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int N = requestUids.length;
1446713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        for (int i=0; i<N; i++) {
1447713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            if (requestUids[i] != caller) {
1448713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return false;
1449713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1450713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1451713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return true;
1452713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1453713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1454713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1455713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a HealthStatsParceler for the given uid. You should probably call
1456010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * updateExternalStatsSync first.
1457713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1458713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    HealthStatsParceler getHealthStatsForUidLocked(int requestUid) {
1459713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter();
1460713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS);
1461713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid);
1462713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (uid != null) {
1463713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            writer.writeUid(uidWriter, mStats, uid);
1464713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1465713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return new HealthStatsParceler(uidWriter);
1466713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1467713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1469