BatteryStatsService.java revision 29fb1f7bed46c7ec6a9465827302a6438da2dfa6
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;
52fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeyimport com.android.internal.util.DumpUtils;
53cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
54455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport com.android.server.power.BatterySaverPolicy.ServiceType;
557ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yuimport android.util.StatsLog;
5632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
61515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
62515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
63515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
64515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
65515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
66713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays;
67e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
68b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.ExecutionException;
69b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.Future;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
75cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
7668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        implements PowerManagerInternal.LowPowerModeListener,
7768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        BatteryStatsImpl.PlatformIdleStateCallback {
78c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
7982ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato    static final boolean DBG = false;
80c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
81010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static IBatteryStats sService;
82010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
84e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider;
85b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final Context mContext;
86b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final BatteryExternalStatsWorker mWorker;
874b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
8868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
89d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    private native int getSubsystemLowPowerStats(ByteBuffer outBuffer);
9068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
9168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .newDecoder()
9268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onMalformedInput(CodingErrorAction.REPLACE)
9368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
9468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .replaceWith("?");
9568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE);
9668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE);
9768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private static final int MAX_LOW_POWER_STATS_SIZE = 512;
9868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
9968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    @Override
10068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    public String getPlatformLowPowerStats() {
10182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
102cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        try {
103cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.clear();
104cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.clear();
105cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.reset();
106cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat);
107cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            if (bytesWritten < 0) {
108cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return null;
109cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            } else if (bytesWritten == 0) {
110cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return "Empty";
111cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            }
112cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.limit(bytesWritten);
113cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
114cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.flip();
115cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            return mUtf16BufferStat.toString();
116cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        } finally {
11782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats");
11868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        }
11968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    }
12068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
121d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    @Override
122d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    public String getSubsystemLowPowerStats() {
123d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        Slog.d(TAG, "begin getSubsystemLowPowerStats");
124d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        try {
125d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.clear();
126d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.clear();
127d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.reset();
128d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            int bytesWritten = getSubsystemLowPowerStats(mUtf8BufferStat);
129d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            if (bytesWritten < 0) {
130d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return null;
131d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            } else if (bytesWritten == 0) {
132d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return "Empty";
133d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            }
134d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.limit(bytesWritten);
135d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
136d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.flip();
137d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            return mUtf16BufferStat.toString();
138d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        } finally {
139d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            Slog.d(TAG, "end getSubsystemLowPowerStats");
140d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        }
141d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    }
142d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy
143b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    BatteryStatsService(Context context, File systemDir, Handler handler) {
1444b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
145b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mContext = context;
146e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() {
147e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            private UserManagerInternal umi;
148e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            @Override
149e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            public int[] getUserIds() {
150e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                if (umi == null) {
151e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                    umi = LocalServices.getService(UserManagerInternal.class);
152e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                }
153e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                return (umi != null) ? umi.getUserIds() : null;
154e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            }
155e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        };
156e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        mStats = new BatteryStatsImpl(systemDir, handler, this, mUserManagerUserInfoProvider);
157b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker = new BatteryExternalStatsWorker(context, mStats);
158b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setExternalStatsSyncLocked(mWorker);
159b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
160b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);
161b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setPowerProfileLocked(new PowerProfile(context));
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
16368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
164b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    public void publish() {
1656832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
1662c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1672c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
168b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private static void awaitUninterruptibly(Future<?> future) {
169b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        while (true) {
170b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            try {
171b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                future.get();
172b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
173b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (ExecutionException e) {
174b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
175b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (InterruptedException e) {
176b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                // Keep looping
177b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
178b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        }
179b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    }
180b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
1812c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
1822c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
1832c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
1842c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
1852c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
186010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
187010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        powerMgr.registerLowPowerModeObserver(this);
18814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        synchronized (mStats) {
18914ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(
19014ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                    powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
19114ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                            .batterySaverEnabled);
19214ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
193c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
1942c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1952c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
19655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
1978a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
1984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
199b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("shutdown", BatteryExternalStatsWorker.UPDATE_ALL));
200b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
20155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
2026b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
20355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
20420b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski
20520b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        // Shutdown the thread we made.
206b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.shutdown();
20755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
20855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
21391268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
217cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
218cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
219455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public int getServiceType() {
220455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei        return ServiceType.BATTERY_STATS;
221455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
222455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
223455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    @Override
224455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public void onLowPowerModeChanged(PowerSaveState result) {
225cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
22614ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(result.batterySaverEnabled);
227cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
228cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
229cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2380068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2424b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2434b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
244b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleWrite();
2454b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2464b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2472f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
2482f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
249b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
250b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
251b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
252b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
253b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
254b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
255b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
256b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
257b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
258e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    void onCleanupUser(int userId) {
259e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        synchronized (mStats) {
260e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            mStats.onCleanupUserLocked(userId);
261e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        }
262e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    }
263e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla
264e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    void onUserRemoved(int userId) {
265e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        synchronized (mStats) {
266e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla            mStats.onUserRemovedLocked(userId);
267e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla        }
268e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla    }
269e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla
2702f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
2712f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2722f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
2732f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2742f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2752f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2762f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
2772f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
27861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
2792f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2802f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2812f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2822f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
2832f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2842f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
2857ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu
2867ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // TODO: remove this once we figure out properly where and how
2877ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // PROCESS_EVENT = 1112
2887ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // EVENT SUBTYPE: START = 1
2897ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // KEY_NAME: 1
2907ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // KEY_UID: 2
2917ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            StatsLog.writeArray(1112, 1, 1, name, 2, uid);
2922f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2932f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2942f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2951e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
2961e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2971e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
2987ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu
2997ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // TODO: remove this once we figure out properly where and how
3007ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // PROCESS_EVENT = 1112
3017ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // EVENT SUBTYPE: CRASH = 2
3027ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // KEY_NAME: 1
3037ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            // KEY_UID: 2
3047ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yu            StatsLog.writeArray(1112, 2, 1, name, 2, uid);
3051e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3061e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3071e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
3081e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
3091e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
3101e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
3111e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
3121e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
3131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
314a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteProcessFinish(String name, int uid) {
3152f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
316a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
3172f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3192f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
320a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteUidProcessState(int uid, int state) {
3212f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
322a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteUidProcessStateLocked(uid, state);
3232f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
3242f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
3252f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3262f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
3272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
3318a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
3328a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
334b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL));
3354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3364b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3374b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3420068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3430068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
3440068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
3450068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
3460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
3470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
349b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL));
3504b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3514b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3524b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
3540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
3550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
3560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
3570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
3580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
3590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
3600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
3620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3634870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
3644870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
3654870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
3664870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
3674870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
3684870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
369ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
370ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
371ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
372ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
373ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
374ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
375ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
376ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
377ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
378ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
379ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
380ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
381ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
382ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
383099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
384099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
385099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
386099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
387099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
388099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
389099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
390fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
391fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
392fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
393fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
394fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
395fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
396fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
397fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
398fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
399fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
400fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
401fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
402fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
403fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
404fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
405fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
406fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
407fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
408fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
409fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
410fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
41194326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn    public void noteJobFinish(String name, int uid, int stopReason) {
412fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
413fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
41494326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn            mStats.noteJobFinishLocked(name, uid, stopReason);
415fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
416fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
4181e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
4191e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4201e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
4211e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
4221e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4231e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4241e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
4251e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
4261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
4271e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
4281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
4291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
4301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
4311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
432a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
4333d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
436e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
43740c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
441cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
444cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
445cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
449a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
450a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
4517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
453a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
454a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
4557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
458cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
459cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
460e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
461e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
462e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
463cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
464e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
465e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
466e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
467e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
468cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
469cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
4707e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
472cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
4737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
476d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockStart(String name, String historyName, int uid) {
477d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
478d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
479d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockStart(name, historyName, uid);
480d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
481d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
482d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
483d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockFinish(String name, String historyName, int uid) {
484d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
485d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
486d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockFinish(name, historyName, uid);
487d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
488d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
489d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4939adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
49629fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5009adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
50329fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
504a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
505a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
506a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
507a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
508a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
509a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
510a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
511a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
512a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
513a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
514a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
515a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
516a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
517a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5216b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
52429fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5286b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
53129fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
532e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
53482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteScreenState");
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
536e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
53729fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu            // TODO: remove this once we figure out properly where and how
53829fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu            // SCREEN_EVENT = 1003
53929fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu            // State key: 1
54029fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu            // State value: state. We can change this to our own def later.
54129fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu            StatsLog.writeArray(1003, 1, state);
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
54382ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteScreenState");
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
54529fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu
546617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
547617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
548617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
549617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
550617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
551617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
552617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
553e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
556e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
559617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
560280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
561280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
562280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
563280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
564280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
565280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
566280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
567e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
568617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
569617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
570e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
573e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5741e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
5751e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
5761e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
5771e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
5781e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
5791e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
5801e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
581fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi    public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
582e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
583b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        final boolean update;
584e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
58514ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid);
58614ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
58714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski
58814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        if (update) {
589b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("modem-data", BatteryExternalStatsWorker.UPDATE_RADIO);
590e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
591e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
592e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
606105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
607e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
608627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
609627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
610e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
611627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
612627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
613627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
614627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
615627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
616627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
619627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
62032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
621f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
62232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
623e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
62432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
625e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
62632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
62732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
62832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
62958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
630105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
631105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
63258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
634105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
635105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
63658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
637105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
638105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
63958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
640105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
641105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
642d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
643244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
644244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
650244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
651244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
652244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
653244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
654244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
655244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
656244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
657244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
658244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
659244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
660244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
661244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
662244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
663244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
664244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
665244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
666244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
667244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
668244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
669244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
670244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
67110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
67210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
67310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
67410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
67510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
67610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
67710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
67810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
67910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
68010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
68110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
68210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
68310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
68410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
6856d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
686abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
687abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6886d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
689abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
690abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
691abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
6926d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
693abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
694abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6956d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
6966d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6976d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6986d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6996d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
7006d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
70182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteStartCamera");
7026d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7036d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
7046d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
70582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteStartCamera");
7066d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7076d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7086d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
7096d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7106d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7116d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
7126d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7136d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7146d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7156d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
7166d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7176d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7186d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
7196d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
7206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
7216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
7226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
7236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
7246d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
7256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
726abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
727abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
728abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
729e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
7305f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) {
731e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
732e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
733e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
734e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
7350c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
736a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
73706f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
73806f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
73906f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
740b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                mWorker.scheduleSync("wifi-data: " + type, BatteryExternalStatsWorker.UPDATE_WIFI);
741a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
7425f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski            mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
7430c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
744e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
745e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
74658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
747d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
748d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
74958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
750d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
751d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
752d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
75358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
754d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
755d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
75658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
75758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
75858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
75958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
76058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
76158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
76258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
76358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
764d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
765d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
766d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
767ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
768ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
769ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
770ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
771ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
772ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
773ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
7743251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
7753251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7763251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7773251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
7783251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7793251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7803251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7813251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
7823251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7833251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7843251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
7853251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7863251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7873251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
788105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
789105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
793105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
794105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
796105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
797105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
798105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
799105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
800105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8016ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8026ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
803105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
804105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8056ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
806105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
807105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8086ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
8096ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
810105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
811105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
8126ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
813105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8165347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
8175347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
8205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
8245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
8255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
8265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
8275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
8285347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
8295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
8307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
8317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
8347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
8387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
8417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8446ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
8457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8467e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8476ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
8487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8497e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8516ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
8527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8537e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8546ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
8557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
858a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
859a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
860a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
861a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
862a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
863a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
864a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
865a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
866a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
867a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
868a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
869a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
870a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
871a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
8727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
8737e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
8767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
8807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
8817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
8847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8877a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
8891059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
8901059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
8914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
8921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
8931059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
8941059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
8957a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8967a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
8977a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
898b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // During device boot, qtaguid isn't enabled until after the inital
899b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // loading of battery stats. Now that they're enabled, take our initial
900b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // snapshot for future delta calculation.
901b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleSync("network-stats-enabled",
902b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                BatteryExternalStatsWorker.UPDATE_RADIO | BatteryExternalStatsWorker.UPDATE_WIFI);
9037a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
9047a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
9058ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
90608c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
9078ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9088ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
90908c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
9108ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9118ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9128ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9138ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
9148ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9158ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9168ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
9178ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9188ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9198ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9208ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
9218ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
9228ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
9238ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
9248ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
9258ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
9268ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
9276771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
928b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz    public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) {
9296771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9309f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
931b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz            mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized);
9329f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9336771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9346771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
9356771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
93694c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz    public void noteBleScanStopped(WorkSource ws, boolean isUnoptimized) {
9376771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
9389f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
93994c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz            mStats.noteBluetoothScanStoppedFromSourceLocked(ws, isUnoptimized);
9409f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
9419f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
9429f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
9439f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    @Override
9449f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public void noteResetBleScan() {
9459f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        enforceCallingPermission();
9469f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9479f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteResetBluetoothScanLocked();
9489f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
949956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    }
950956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz
951956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    @Override
9524ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz    public void noteBleScanResults(WorkSource ws, int numNewResults) {
953956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        enforceCallingPermission();
954956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        synchronized (mStats) {
9554ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz            mStats.noteBluetoothScanResultsFromSourceLocked(ws, numNewResults);
956956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        }
9576771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9586771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
959010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
960010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteWifiControllerActivity(WifiActivityEnergyInfo info) {
961010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
962010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
963010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
964010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid wifi data given: " + info);
965010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
966010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
967010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
96814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateWifiState(info);
969010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
970010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
971010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
972010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) {
973010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
974010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
975010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid bluetooth data given: " + info);
976010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
977010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
978010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
979b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.updateBluetoothStateLocked(info);
980010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
981010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
982010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
983010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteModemControllerActivity(ModemActivityInfo info) {
984010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
985010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
986010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
987010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid modem data given: " + info);
988010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
989010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
990010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
99114ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateMobileRadioState(info);
992010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
993010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
998d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
999d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
1000041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int level, final int temp, final int volt, final int chargeUAh,
1001041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int chargeFullUAh) {
1002d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
1003d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1004d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
1005d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
1006b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleRunnable(() -> {
1007b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            synchronized (mStats) {
1008b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
1009b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                if (mStats.isOnBattery() == onBattery) {
1010b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // The battery state has not changed, so we don't need to sync external
1011b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // stats immediately.
1012b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1013b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                            chargeUAh, chargeFullUAh);
1014b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    return;
1015d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1016b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
1017d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
1018b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Sync external stats first as the battery has changed states. If we don't sync
1019b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // before changing the state, we may not collect the relevant data later.
1020b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Order here is guaranteed since we're scheduling from the same thread and we are
1021b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // using a single threaded executor.
1022b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("battery-state", BatteryExternalStatsWorker.UPDATE_ALL);
1023b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleRunnable(() -> {
1024d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
1025926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
1026041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski                            chargeUAh, chargeFullUAh);
1027d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
1028b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            });
1029d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
1030633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
1031633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1051c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1052c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
1053515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
1054515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
1055515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
1056515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
1057c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1058c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
1059c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
1060c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1061c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1062c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
1063c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
1064c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1065515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
1066515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
1067515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
1068515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
1069515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
1070515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1071515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
1072515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
1073515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1074c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
1075515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
1076515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
1077c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
1078515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
1079c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1080c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
1081c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
1082c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
1083c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
1084c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1085515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1086515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
1087515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
1088515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
1089515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
1090515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1091515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
1092515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
1093515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
1094515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
1095515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
1096515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
1097515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1098515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
1099515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
1100515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1101515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
1102515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
1103515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
1104515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
1105515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1106515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
1107515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
1108515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
1109c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1110c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1111515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
1112c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1113ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
111491268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
11151e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
1116d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
1117865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
1118865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
11191476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato        pw.println("  -c: write the current stats in checkin format.");
1120099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
1121c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
1122c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
1123d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
1124ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
1125ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
1126d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
1127d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
1128cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
1129fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
1130fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
1131fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
1132fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
1133fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
11340068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
11351e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
1136fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
1137674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        pw.println("      pretend-screen-off: pretend the screen is off, even if screen state changes");
1138ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1139ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1140cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1141cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1142cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1143cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1144cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1145cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1146cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
11470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1148cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
11490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1150cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
11519a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
11529a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
11539a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
11549a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1155674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        } else if ("pretend-screen-off".equals(args[i])) {
1156674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            synchronized (mStats) {
1157674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani                mStats.setPretendScreenOff(enable);
1158674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            }
1159cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1160cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1161cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1162cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1163cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1164cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1165cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1166cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
11674b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
11706df866a8510af2776c48425a361f708ae7f5d7d6Jeff Sharkey        if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
11713abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1172c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
11730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
11740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
11750ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
117616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
1177c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
1178cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
1179e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
1180c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
1181c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
1182e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
11830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
11840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
1185099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
1186c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1187c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
1188c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1189c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
1190c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
1191c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
1192c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
1193c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
1194c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1195c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
119616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
119749021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
11980068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
1199c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
1200c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1201c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1202d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1203d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1204e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1205e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
12063d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1207e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
12080ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1210b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL);
12110ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
1212b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    awaitUninterruptibly(mWorker.scheduleSync("dump",
1213b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                            BatteryExternalStatsWorker.UPDATE_ALL));
12140ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
12150ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
12160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
12170ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
12180ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1219d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1220d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1221d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1222d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1223d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1224d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1225d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1226d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1227d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1228d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1229d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1230d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1231fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1232cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1233cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1234cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1235cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1236cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1237cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1238fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1239cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1240cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1241cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1242cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1243cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1244cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1245ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1246ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1247ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1248e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1249a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1250cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
12510ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1252ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1253cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1254cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1255cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1256cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1257e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey                        reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
1258cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1259cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1260cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1261cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1262cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1263cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1266e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
12670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
12680ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12690ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
127013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
127113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
127213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
127313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
127413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
127513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
127613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
1277b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL));
127813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
127913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1280d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
128113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1282ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1283ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1284ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
12851e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1286ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1287ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1288ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1289ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1290ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
12914b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12920068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (useCheckinFormat) {
12939cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
12940d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
12950068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
12960068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
12970068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
12980068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
12990068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
13000068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
13010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
13020068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
13030068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
13040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
13050068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
13060068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
1307e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla                                        null, mStats.mHandler, null, mUserManagerUserInfoProvider);
13080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
13090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
13100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
13110068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
13120068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
13130068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
13140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
13159ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
13160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
13170068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
13180068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
13190068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
13200068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
13210068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
132282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
1323e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1324c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
132516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
132616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
132716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1328e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
132982ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpCheckinLocked");
1330e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
133182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
1332e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1333c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
133416b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
133516b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
133616b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1337e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
133882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpLocked");
13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
13414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1342713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1343713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a particular uid.
1344713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1345713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1346713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler takeUidSnapshot(int requestUid) {
1347713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (requestUid != Binder.getCallingUid()) {
1348713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1349713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1350713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1351713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1352713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1353b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
1354b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    BatteryExternalStatsWorker.UPDATE_ALL));
1355713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1356713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return getHealthStatsForUidLocked(requestUid);
1357713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1358713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
135982ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
1360713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1361713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1362713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1363713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1364713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1365713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1366713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1367713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a number of uids.
1368713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1369713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1370713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) {
1371713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (!onlyCaller(requestUids)) {
1372713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1373713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1374713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1375713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1376713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        int i=-1;
1377713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1378b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
1379b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    BatteryExternalStatsWorker.UPDATE_ALL));
1380713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1381713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final int N = requestUids.length;
1382713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final HealthStatsParceler[] results = new HealthStatsParceler[N];
1383713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                for (i=0; i<N; i++) {
1384713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    results[i] = getHealthStatsForUidLocked(requestUids[i]);
1385713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                }
1386713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return results;
1387713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1388713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
138982ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
1390713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    + Arrays.toString(requestUids) + ") i=" + i, ex);
1391713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1392713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1393713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1394713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1395713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1396713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1397713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1398713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Returns whether the Binder.getCallingUid is the only thing in requestUids.
1399713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1400713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    private static boolean onlyCaller(int[] requestUids) {
1401713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int caller = Binder.getCallingUid();
1402713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int N = requestUids.length;
1403713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        for (int i=0; i<N; i++) {
1404713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            if (requestUids[i] != caller) {
1405713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return false;
1406713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1407713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1408713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return true;
1409713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1410713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1411713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1412713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a HealthStatsParceler for the given uid. You should probably call
1413010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * updateExternalStatsSync first.
1414713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1415713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    HealthStatsParceler getHealthStatsForUidLocked(int requestUid) {
1416713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter();
1417713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS);
1418713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid);
1419713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (uid != null) {
1420713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            writer.writeUid(uidWriter, mStats, uid);
1421713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1422713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return new HealthStatsParceler(uidWriter);
1423713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1424713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1426