BatteryStatsService.java revision 94326cb56aa0c7cee110d6781fb8b8f16fb09663
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;
377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource;
38713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler;
39713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter;
40713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats;
4106f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo;
4221f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo;
43e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength;
44e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager;
458a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog;
46674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani
4732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats;
48d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper;
4932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl;
50e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile;
51fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeyimport com.android.internal.util.DumpUtils;
52cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices;
53455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport com.android.server.power.BatterySaverPolicy.ServiceType;
5432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File;
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor;
570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException;
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter;
59515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer;
60515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer;
61515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder;
62515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction;
63515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets;
64713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays;
65e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List;
66b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.ExecutionException;
67b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.Future;
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life.
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
73cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub
7468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        implements PowerManagerInternal.LowPowerModeListener,
7568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        BatteryStatsImpl.PlatformIdleStateCallback {
76c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    static final String TAG = "BatteryStatsService";
7782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato    static final boolean DBG = false;
78c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
79010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    private static IBatteryStats sService;
80010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    final BatteryStatsImpl mStats;
82b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final Context mContext;
83b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private final BatteryExternalStatsWorker mWorker;
844b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
8568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private native int getPlatformLowPowerStats(ByteBuffer outBuffer);
86d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    private native int getSubsystemLowPowerStats(ByteBuffer outBuffer);
8768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8
8868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .newDecoder()
8968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onMalformedInput(CodingErrorAction.REPLACE)
9068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
9168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan                    .replaceWith("?");
9268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE);
9368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE);
9468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    private static final int MAX_LOW_POWER_STATS_SIZE = 512;
9568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
9668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    @Override
9768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    public String getPlatformLowPowerStats() {
9882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
99cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        try {
100cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.clear();
101cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.clear();
102cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.reset();
103cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat);
104cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            if (bytesWritten < 0) {
105cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return null;
106cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            } else if (bytesWritten == 0) {
107cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski                return "Empty";
108cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            }
109cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf8BufferStat.limit(bytesWritten);
110cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
111cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            mUtf16BufferStat.flip();
112cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski            return mUtf16BufferStat.toString();
113cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski        } finally {
11482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats");
11568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan        }
11668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan    }
11768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
118d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    @Override
119d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    public String getSubsystemLowPowerStats() {
120d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        Slog.d(TAG, "begin getSubsystemLowPowerStats");
121d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        try {
122d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.clear();
123d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.clear();
124d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.reset();
125d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            int bytesWritten = getSubsystemLowPowerStats(mUtf8BufferStat);
126d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            if (bytesWritten < 0) {
127d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return null;
128d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            } else if (bytesWritten == 0) {
129d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy                return "Empty";
130d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            }
131d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf8BufferStat.limit(bytesWritten);
132d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true);
133d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            mUtf16BufferStat.flip();
134d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            return mUtf16BufferStat.toString();
135d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        } finally {
136d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy            Slog.d(TAG, "end getSubsystemLowPowerStats");
137d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy        }
138d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy    }
139d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy
140b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    BatteryStatsService(Context context, File systemDir, Handler handler) {
1414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through.
142b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mContext = context;
143b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats = new BatteryStatsImpl(systemDir, handler, this);
144b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker = new BatteryExternalStatsWorker(context, mStats);
145b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setExternalStatsSyncLocked(mWorker);
146b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
147b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                com.android.internal.R.integer.config_radioScanningTimeout) * 1000L);
148b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.setPowerProfileLocked(new PowerProfile(context));
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
15068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan
151b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    public void publish() {
1526832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski        ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
1532c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1542c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
155b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    private static void awaitUninterruptibly(Future<?> future) {
156b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        while (true) {
157b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            try {
158b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                future.get();
159b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
160b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (ExecutionException e) {
161b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                return;
162b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            } catch (InterruptedException e) {
163b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                // Keep looping
164b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
165b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        }
166b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski    }
167b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
1682c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    /**
1692c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * At the time when the constructor runs, the power manager has not yet been
1702c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     * initialized.  So we initialize the low power observer later.
1712c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown     */
1722c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    public void initPowerManagement() {
173010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
174010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        powerMgr.registerLowPowerModeObserver(this);
17514ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        synchronized (mStats) {
17614ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(
17714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                    powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
17814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski                            .batterySaverEnabled);
17914ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
180c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        (new WakeupReasonThread()).start();
1812c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown    }
1822c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown
18355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    public void shutdown() {
1848a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        Slog.w("BatteryStats", "Writing battery stats before shutdown...");
1854b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
186b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("shutdown", BatteryExternalStatsWorker.UPDATE_ALL));
187b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski
18855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        synchronized (mStats) {
1896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.shutdownLocked();
19055280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn        }
19120b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski
19220b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski        // Shutdown the thread we made.
193b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.shutdown();
19455280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn    }
19555280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public static IBatteryStats getService() {
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (sService != null) {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return sService;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
20091268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME);
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sService = asInterface(b);
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return sService;
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
204cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
205cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    @Override
206455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public int getServiceType() {
207455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei        return ServiceType.BATTERY_STATS;
208455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    }
209455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei
210455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    @Override
211455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei    public void onLowPowerModeChanged(PowerSaveState result) {
212cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        synchronized (mStats) {
21314ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            mStats.notePowerSaveModeLocked(result.batterySaverEnabled);
214cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
215cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
216cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the current statistics object, which may be modified
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * to reflect events that affect battery usage.  You must lock the
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * stats object before doing anything with it.
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public BatteryStatsImpl getActiveStatistics() {
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats;
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2250068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
2264b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    /**
2274b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * Schedules a write to disk to occur. This will cause the BatteryStatsImpl
2284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     * object to update with the latest info, then write to disk.
2294b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski     */
2304b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void scheduleWriteToDisk() {
231b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleWrite();
2324b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    }
2334b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
2342f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // These are for direct use by the activity manager...
2352f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
236b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    /**
237b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     * Remove a UID from the BatteryStats and BatteryStats' external dependencies.
238b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski     */
239b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    void removeUid(int uid) {
240b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        synchronized (mStats) {
241b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski            mStats.removeUidStatsLocked(uid);
242b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski        }
243b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski    }
244b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski
2452f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void addIsolatedUid(int isolatedUid, int appUid) {
2462f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2472f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.addIsolatedUidLocked(isolatedUid, appUid);
2482f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2492f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2502f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2512f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void removeIsolatedUid(int isolatedUid, int appUid) {
2522f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
25361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski            mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid);
2542f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2552f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2562f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2572f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    void noteProcessStart(String name, int uid) {
2582f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
2592f1993ec460166413e7887f151630f6708077c0fDianne Hackborn            mStats.noteProcessStartLocked(name, uid);
2602f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2612f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2622f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2631e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessCrash(String name, int uid) {
2641e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2651e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessCrashLocked(name, uid);
2661e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2671e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2681e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
2691e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    void noteProcessAnr(String name, int uid) {
2701e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
2711e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteProcessAnrLocked(name, uid);
2721e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
2731e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
2741e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
275a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteProcessFinish(String name, int uid) {
2762f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
277a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteProcessFinishLocked(name, uid);
2782f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2792f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2802f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
281a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn    void noteUidProcessState(int uid, int state) {
2822f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        synchronized (mStats) {
283a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn            mStats.noteUidProcessStateLocked(uid, state);
2842f1993ec460166413e7887f151630f6708077c0fDianne Hackborn        }
2852f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    }
2862f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2872f1993ec460166413e7887f151630f6708077c0fDianne Hackborn    // Public interface...
2882f1993ec460166413e7887f151630f6708077c0fDianne Hackborn
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public byte[] getStatistics() {
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingPermission(
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
2928a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //Slog.i("foo", "SENDING BATTERY INFO:");
2938a9b22056b13477f59df934928c00c58b5871c95Joe Onorato        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        Parcel out = Parcel.obtain();
295b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL));
2964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
2974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
2984b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        byte[] data = out.marshall();
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out.recycle();
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return data;
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3030068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3040068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    public ParcelFileDescriptor getStatisticsStream() {
3050068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        mContext.enforceCallingPermission(
3060068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                android.Manifest.permission.BATTERY_STATS, null);
3070068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //Slog.i("foo", "SENDING BATTERY INFO:");
3080068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM));
3090068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        Parcel out = Parcel.obtain();
310b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL));
3114b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        synchronized (mStats) {
3124b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.writeToParcel(out, 0);
3134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski        }
3140068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        byte[] data = out.marshall();
3150068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        out.recycle();
3160068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        try {
3170068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return ParcelFileDescriptor.fromData(data, "battery-stats");
3180068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        } catch (IOException e) {
3190068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            Slog.w(TAG, "Unable to create shared memory", e);
3200068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            return null;
3210068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        }
3220068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn    }
3230068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn
3244870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    public boolean isCharging() {
3254870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        synchronized (mStats) {
3264870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            return mStats.isCharging();
3274870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        }
3284870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn    }
3294870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn
330ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeBatteryTimeRemaining() {
331ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
332ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime());
333ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
334ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
335ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
336ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
337ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    public long computeChargeTimeRemaining() {
338ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        synchronized (mStats) {
339ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime());
340ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn            return time >= 0 ? (time/1000) : time;
341ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn        }
342ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn    }
343ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn
344099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    public void noteEvent(int code, String name, int uid) {
345099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        enforceCallingPermission();
346099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        synchronized (mStats) {
347099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn            mStats.noteEventLocked(code, name, uid);
348099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        }
349099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn    }
350099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn
351fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncStart(String name, int uid) {
352fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
353fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
354fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncStartLocked(name, uid);
355fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
356fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
357fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
358fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteSyncFinish(String name, int uid) {
359fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
360fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
361fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteSyncFinishLocked(name, uid);
362fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
363fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
364fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
365fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    public void noteJobStart(String name, int uid) {
366fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
367fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
368fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn            mStats.noteJobStartLocked(name, uid);
369fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
370fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
371fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
37294326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn    public void noteJobFinish(String name, int uid, int stopReason) {
373fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        enforceCallingPermission();
374fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        synchronized (mStats) {
37594326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn            mStats.noteJobFinishLocked(name, uid, stopReason);
376fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn        }
377fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn    }
378fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn
3791e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmStart(String name, int uid) {
3801e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3811e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3821e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmStartLocked(name, uid);
3831e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3841e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3851e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
3861e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    public void noteAlarmFinish(String name, int uid) {
3871e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        enforceCallingPermission();
3881e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        synchronized (mStats) {
3891e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn            mStats.noteAlarmFinishLocked(name, uid);
3901e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        }
3911e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn    }
3921e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn
393a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelock(int uid, int pid, String name, String historyName, int type,
3943d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn            boolean unimportantForLogging) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
397e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging,
39840c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
402cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) {
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
405cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeLocked(uid, pid, name, historyName, type,
406cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
410a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn    public void noteStartWakelockFromSource(WorkSource ws, int pid, String name,
411a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            String historyName, int type, boolean unimportantForLogging) {
4127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
414a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn            mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName,
415a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn                    type, unimportantForLogging);
4167e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4177e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4187e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
419cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name,
420cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            String historyName, int type, WorkSource newWs, int newPid, String newName,
421e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn            String newHistoryName, int newType, boolean newUnimportantForLogging) {
422e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        enforceCallingPermission();
423e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        synchronized (mStats) {
424cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type,
425e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn                    newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging);
426e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn        }
427e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn    }
428e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn
429cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName,
430cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            int type) {
4317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
4327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
433cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type);
4347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
4357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
4367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
437d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockStart(String name, String historyName, int uid) {
438d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
439d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
440d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockStart(name, historyName, uid);
441d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
442d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
443d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
444d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    public void noteLongPartialWakelockFinish(String name, String historyName, int uid) {
445d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        enforceCallingPermission();
446d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        synchronized (mStats) {
447d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn            mStats.noteLongPartialWakelockFinish(name, historyName, uid);
448d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn        }
449d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn    }
450d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartSensor(int uid, int sensor) {
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4549adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStartSensorLocked(uid, sensor);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopSensor(int uid, int sensor) {
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4619adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn            mStats.noteStopSensorLocked(uid, sensor);
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
465a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOn(int uid, long durationMillis) {
466a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
467a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
468a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOnLocked(uid, durationMillis);
469a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
470a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
471a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
472a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void noteVibratorOff(int uid) {
473a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        enforceCallingPermission();
474a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        synchronized (mStats) {
475a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mStats.noteVibratorOffLocked(uid);
476a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
477a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
478a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStartGps(int uid) {
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4826b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStartGpsLocked(uid);
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void noteStopGps(int uid) {
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
4896b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn            mStats.noteStopGpsLocked(uid);
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
493e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteScreenState(int state) {
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
49582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteScreenState");
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
497e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteScreenStateLocked(state);
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
49982ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteScreenState");
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
502617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    public void noteScreenBrightness(int brightness) {
503617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
504617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
505617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn            mStats.noteScreenBrightnessLocked(brightness);
506617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
507617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
508617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
509e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteUserActivity(int uid, int event) {
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
512e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteUserActivityLocked(uid, event);
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
515617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn
516280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    public void noteWakeUp(String reason, int reasonUid) {
517280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        enforceCallingPermission();
518280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        synchronized (mStats) {
519280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn            mStats.noteWakeUpLocked(reason, reasonUid);
520280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn        }
521280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn    }
522280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn
523e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown    public void noteInteractive(boolean interactive) {
524617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        enforceCallingPermission();
525617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        synchronized (mStats) {
526e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown            mStats.noteInteractiveLocked(interactive);
527617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn        }
528617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn    }
529e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5301e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    public void noteConnectivityChanged(int type, String extra) {
5311e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        enforceCallingPermission();
5321e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        synchronized (mStats) {
5331e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn            mStats.noteConnectivityChangedLocked(type, extra);
5341e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn        }
5351e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn    }
5361e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn
537fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi    public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
538e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        enforceCallingPermission();
539b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        final boolean update;
540e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        synchronized (mStats) {
54114ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski            update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid);
54214ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        }
54314ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski
54414ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        if (update) {
545b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("modem-data", BatteryExternalStatsWorker.UPDATE_RADIO);
546e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn        }
547e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn    }
548e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOn() {
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOnLocked();
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void notePhoneOff() {
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        enforceCallingPermission();
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        synchronized (mStats) {
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mStats.notePhoneOffLocked();
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
562105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
563e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville    public void notePhoneSignalStrength(SignalStrength signalStrength) {
564627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
565627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
566e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville            mStats.notePhoneSignalStrengthLocked(signalStrength);
567627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
568627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
569627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn
570627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    public void notePhoneDataConnectionState(int dataType, boolean hasData) {
571627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        enforceCallingPermission();
572627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        synchronized (mStats) {
573627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn            mStats.notePhoneDataConnectionStateLocked(dataType, hasData);
574627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn        }
575627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn    }
57632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
577f37447bad3773b62176baa837908daf6edb44273Amith Yamasani    public void notePhoneState(int state) {
57832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        enforceCallingPermission();
579e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        int simState = TelephonyManager.getDefault().getSimState();
58032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        synchronized (mStats) {
581e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            mStats.notePhoneStateLocked(state, simState);
58232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani        }
58332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani    }
58432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani
58558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOn() {
586105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
587105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
58858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOnLocked();
589105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
590105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
591105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
59258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiOff() {
593105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
594105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
59558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiOffLocked();
596105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
597105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
598d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
599244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartAudio(int uid) {
600244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
601244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
602244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOnLocked(uid);
603244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
604244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
605244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
606244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopAudio(int uid) {
607244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
608244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
609244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteAudioOffLocked(uid);
610244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
611244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
612244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
613244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStartVideo(int uid) {
614244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
615244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
616244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOnLocked(uid);
617244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
618244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
619244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
620244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    public void noteStopVideo(int uid) {
621244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        enforceCallingPermission();
622244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        synchronized (mStats) {
623244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani            mStats.noteVideoOffLocked(uid);
624244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani        }
625244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani    }
626244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani
62710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetAudio() {
62810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
62910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
63010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetAudioLocked();
63110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
63210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
63310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
63410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    public void noteResetVideo() {
63510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        enforceCallingPermission();
63610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        synchronized (mStats) {
63710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn            mStats.noteResetVideoLocked();
63810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn        }
63910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn    }
64010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn
6416d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOn(int uid) {
642abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
643abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6446d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOnLocked(uid);
645abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
646abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
647abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
6486d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteFlashlightOff(int uid) {
649abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        enforceCallingPermission();
650abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        synchronized (mStats) {
6516d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteFlashlightOffLocked(uid);
6526d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6536d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6546d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6556d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStartCamera(int uid) {
6566d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
65782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "begin noteStartCamera");
6586d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6596d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOnLocked(uid);
6606d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
66182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato        if (DBG) Slog.d(TAG, "end noteStartCamera");
6626d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6636d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6646d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteStopCamera(int uid) {
6656d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6666d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6676d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteCameraOffLocked(uid);
6686d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6696d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6706d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6716d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetCamera() {
6726d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6736d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6746d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetCameraLocked();
6756d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        }
6766d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    }
6776d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk
6786d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk    public void noteResetFlashlight() {
6796d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        enforceCallingPermission();
6806d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk        synchronized (mStats) {
6816d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk            mStats.noteResetFlashlightLocked();
682abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn        }
683abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn    }
684abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn
685e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    @Override
6865f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski    public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) {
687e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        enforceCallingPermission();
688e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
689e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // There was a change in WiFi power state.
690e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski        // Collect data now for the past activity.
6910c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        synchronized (mStats) {
692a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            if (mStats.isOnBattery()) {
69306f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH ||
69406f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
69506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski                        : "inactive";
696b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                mWorker.scheduleSync("wifi-data: " + type, BatteryExternalStatsWorker.UPDATE_WIFI);
697a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski            }
6985f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski            mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
6990c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn        }
700e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski    }
701e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski
70258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunning(WorkSource ws) {
703d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
704d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
70558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningLocked(ws);
706d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
707d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
708d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
70958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) {
710d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        enforceCallingPermission();
711d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        synchronized (mStats) {
71258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiRunningChangedLocked(oldWs, newWs);
71358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        }
71458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    }
71558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn
71658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn    public void noteWifiStopped(WorkSource ws) {
71758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        enforceCallingPermission();
71858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn        synchronized (mStats) {
71958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn            mStats.noteWifiStoppedLocked(ws);
720d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood        }
721d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood    }
722d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood
723ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    public void noteWifiState(int wifiState, String accessPoint) {
724ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        enforceCallingPermission();
725ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        synchronized (mStats) {
726ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn            mStats.noteWifiStateLocked(wifiState, accessPoint);
727ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn        }
728ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn    }
729ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn
7303251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) {
7313251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7323251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7333251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth);
7343251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7353251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7363251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
7373251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    public void noteWifiRssiChanged(int newRssi) {
7383251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        enforceCallingPermission();
7393251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        synchronized (mStats) {
7403251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn            mStats.noteWifiRssiChangedLocked(newRssi);
7413251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn        }
7423251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn    }
7433251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn
744105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockAcquired(int uid) {
745105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
746105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
747105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockAcquiredLocked(uid);
748105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
749105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
750105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project
751105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    public void noteFullWifiLockReleased(int uid) {
752105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
753105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
754105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project            mStats.noteFullWifiLockReleasedLocked(uid);
755105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
756105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7576ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
7586ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStarted(int uid) {
759105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
760105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
7616ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedLocked(uid);
762105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
763105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7646ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly
7656ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStopped(int uid) {
766105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        enforceCallingPermission();
767105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        synchronized (mStats) {
7686ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedLocked(uid);
769105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project        }
770105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project    }
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7725347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastEnabled(int uid) {
7735347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
7745347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
7755347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastEnabledLocked(uid);
7765347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7775347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7785347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7795347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    public void noteWifiMulticastDisabled(int uid) {
7805347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        enforceCallingPermission();
7815347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        synchronized (mStats) {
7825347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt            mStats.noteWifiMulticastDisabledLocked(uid);
7835347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt        }
7845347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt    }
7855347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt
7867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockAcquiredFromSource(WorkSource ws) {
7877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7897e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockAcquiredFromSourceLocked(ws);
7907e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7917e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7927e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
7937e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteFullWifiLockReleasedFromSource(WorkSource ws) {
7947e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
7957e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
7967e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteFullWifiLockReleasedFromSourceLocked(ws);
7977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
7987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
7997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8006ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStartedFromSource(WorkSource ws) {
8017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8036ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStartedFromSourceLocked(ws);
8047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8057e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8076ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly    public void noteWifiScanStoppedFromSource(WorkSource ws) {
8087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8106ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly            mStats.noteWifiScanStoppedFromSourceLocked(ws);
8117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8137e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
814a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) {
815a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
816a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
817a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph);
818a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
819a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
820a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
821a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) {
822a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        enforceCallingPermission();
823a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        synchronized (mStats) {
824a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt            mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws);
825a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt        }
826a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt    }
827a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt
8287e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastEnabledFromSource(WorkSource ws) {
8297e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8307e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8317e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastEnabledFromSourceLocked(ws);
8327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8354b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    @Override
8367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    public void noteWifiMulticastDisabledFromSource(WorkSource ws) {
8377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        enforceCallingPermission();
8387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        synchronized (mStats) {
8397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn            mStats.noteWifiMulticastDisabledFromSourceLocked(ws);
8407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn        }
8417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn    }
8427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn
8437a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8444b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski    public void noteNetworkInterfaceType(String iface, int networkType) {
8451059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        enforceCallingPermission();
8461059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        synchronized (mStats) {
8474b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski            mStats.noteNetworkInterfaceTypeLocked(iface, networkType);
8481059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey        }
8491059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey    }
8501059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey
8517a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    @Override
8527a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    public void noteNetworkStatsEnabled() {
8537a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey        enforceCallingPermission();
854b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // During device boot, qtaguid isn't enabled until after the inital
855b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // loading of battery stats. Now that they're enabled, take our initial
856b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        // snapshot for future delta calculation.
857b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleSync("network-stats-enabled",
858b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                BatteryExternalStatsWorker.UPDATE_RADIO | BatteryExternalStatsWorker.UPDATE_WIFI);
8597a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey    }
8607a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey
8618ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    @Override
86208c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn    public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) {
8638ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8648ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
86508c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn            mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid);
8668ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8678ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8688ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8698ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageInstalled(String pkgName, int versionCode) {
8708ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8718ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
8728ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageInstalledLocked(pkgName, versionCode);
8738ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8748ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8758ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8768ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    public void notePackageUninstalled(String pkgName) {
8778ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        enforceCallingPermission();
8788ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        synchronized (mStats) {
8798ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn            mStats.notePackageUninstalledLocked(pkgName);
8808ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn        }
8818ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn    }
8828ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn
8836771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
884b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz    public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) {
8856771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
8869f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
887b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz            mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized);
8889f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
8896771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
8906771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
8916771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    @Override
8926771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    public void noteBleScanStopped(WorkSource ws) {
8936771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski        enforceCallingPermission();
8949f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
8959f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteBluetoothScanStoppedFromSourceLocked(ws);
8969f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
8979f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    }
8989f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski
8999f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    @Override
9009f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski    public void noteResetBleScan() {
9019f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        enforceCallingPermission();
9029f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        synchronized (mStats) {
9039f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski            mStats.noteResetBluetoothScanLocked();
9049f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski        }
905956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    }
906956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz
907956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz    @Override
9084ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz    public void noteBleScanResults(WorkSource ws, int numNewResults) {
909956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        enforceCallingPermission();
910956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        synchronized (mStats) {
9114ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz            mStats.noteBluetoothScanResultsFromSourceLocked(ws, numNewResults);
912956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz        }
9136771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski    }
9146771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski
915010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
916010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteWifiControllerActivity(WifiActivityEnergyInfo info) {
917010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
918010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
919010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
920010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid wifi data given: " + info);
921010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
922010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
923010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
92414ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateWifiState(info);
925010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
926010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
927010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
928010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) {
929010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
930010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
931010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid bluetooth data given: " + info);
932010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
933010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
934010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
935b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mStats.updateBluetoothStateLocked(info);
936010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
937010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
938010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    @Override
939010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    public void noteModemControllerActivity(ModemActivityInfo info) {
940010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        enforceCallingPermission();
941010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
942010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        if (info == null || !info.isValid()) {
943010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            Slog.e(TAG, "invalid modem data given: " + info);
944010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski            return;
945010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski        }
946010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
94714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski        mStats.updateMobileRadioState(info);
948010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski    }
949010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public boolean isOnBattery() {
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.isOnBattery();
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9534b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
954d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    @Override
955d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski    public void setBatteryState(final int status, final int health, final int plugType,
956041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int level, final int temp, final int volt, final int chargeUAh,
957041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski            final int chargeFullUAh) {
958d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        enforceCallingPermission();
959d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
960d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // BatteryService calls us here and we may update external state. It would be wrong
961d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        // to block such a low level service like BatteryService on external stats like WiFi.
962b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski        mWorker.scheduleRunnable(() -> {
963b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            synchronized (mStats) {
964b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE;
965b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                if (mStats.isOnBattery() == onBattery) {
966b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // The battery state has not changed, so we don't need to sync external
967b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    // stats immediately.
968b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
969b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                            chargeUAh, chargeFullUAh);
970b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    return;
971d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
972b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            }
973d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski
974b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Sync external stats first as the battery has changed states. If we don't sync
975b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // before changing the state, we may not collect the relevant data later.
976b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // Order here is guaranteed since we're scheduling from the same thread and we are
977b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            // using a single threaded executor.
978b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleSync("battery-state", BatteryExternalStatsWorker.UPDATE_ALL);
979b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            mWorker.scheduleRunnable(() -> {
980d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                synchronized (mStats) {
981926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski                    mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt,
982041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski                            chargeUAh, chargeFullUAh);
983d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski                }
984b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            });
985d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski        });
986633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar    }
987633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimeBattery() {
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimeBattery();
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public long getAwakeTimePlugged() {
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforceCallingOrSelfPermission(
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                android.Manifest.permission.BATTERY_STATS, null);
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return mStats.getAwakeTimePlugged();
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void enforceCallingPermission() {
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (Binder.getCallingPid() == Process.myPid()) {
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return;
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS,
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                Binder.getCallingPid(), Binder.getCallingUid(), null);
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1007c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1008c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    final class WakeupReasonThread extends Thread {
1009515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private static final int MAX_REASON_SIZE = 512;
1010515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharsetDecoder mDecoder;
1011515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private ByteBuffer mUtf8Buffer;
1012515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private CharBuffer mUtf16Buffer;
1013c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1014c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        WakeupReasonThread() {
1015c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            super("BatteryStats_wakeupReason");
1016c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1017c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1018c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        public void run() {
1019c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND);
1020c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1021515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder = StandardCharsets.UTF_8
1022515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .newDecoder()
1023515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onMalformedInput(CodingErrorAction.REPLACE)
1024515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .onUnmappableCharacter(CodingErrorAction.REPLACE)
1025515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                    .replaceWith("?");
1026515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1027515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE);
1028515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE);
1029515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1030c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            try {
1031515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                String reason;
1032515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                while ((reason = waitWakeup()) != null) {
1033c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    synchronized (mStats) {
1034515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                        mStats.noteWakeupReasonLocked(reason);
1035c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1036c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                }
1037c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            } catch (RuntimeException e) {
1038c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                Slog.e(TAG, "Failure reading wakeup reasons", e);
1039c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            }
1040c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        }
1041515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1042515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        private String waitWakeup() {
1043515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.clear();
1044515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.clear();
1045515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.reset();
1046515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1047515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            int bytesWritten = nativeWaitWakeup(mUtf8Buffer);
1048515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            if (bytesWritten < 0) {
1049515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return null;
1050515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            } else if (bytesWritten == 0) {
1051515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski                return "unknown";
1052515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            }
1053515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1054515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Set the buffer's limit to the number of bytes written.
1055515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf8Buffer.limit(bytesWritten);
1056515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1057515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Decode the buffer from UTF-8 to UTF-16.
1058515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Unmappable characters will be replaced.
1059515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true);
1060515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            mUtf16Buffer.flip();
1061515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski
1062515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            // Create a String from the UTF-16 buffer.
1063515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski            return mUtf16Buffer.toString();
1064515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski        }
1065c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn    }
1066c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1067515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski    private static native int nativeWaitWakeup(ByteBuffer outBuffer);
1068c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn
1069ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    private void dumpHelp(PrintWriter pw) {
107091268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn        pw.println("Battery stats (batterystats) dump options:");
10711e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn        pw.println("  [--checkin] [--history] [--history-start] [--charged] [-c]");
1072d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]");
1073865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("  --checkin: generate output for a checkin report; will write (and clear) the");
1074865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn        pw.println("             last old completed stats when they had been reset.");
10751476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato        pw.println("  -c: write the current stats in checkin format.");
1076099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn        pw.println("  --history: show only history data.");
1077c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --history-start <num>: show only history data starting at given time offset.");
1078c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        pw.println("  --charged: only output data since last charged.");
1079d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --daily: only output full daily data.");
1080ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --reset: reset the stats, clearing all current data.");
1081ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn        pw.println("  --write: force write current collected stats to disk.");
1082d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --new-daily: immediately create and write new daily stats record.");
1083d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn        pw.println("  --read-daily: read-load last written daily stats.");
1084cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        pw.println("  <package.name>: optional name of package to filter output by.");
1085fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  -h: print this help text.");
1086fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("Battery stats (batterystats) commands:");
1087fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("  enable|disable <option>");
1088fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Enable or disable a running option.  Option state is not saved across boots.");
1089fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("    Options are:");
10900068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        pw.println("      full-history: include additional detailed events in battery history:");
10911e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn        pw.println("          wake_lock_in, alarms and proc events");
1092fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn        pw.println("      no-auto-reset: don't automatically reset stats when unplugged");
1093674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        pw.println("      pretend-screen-off: pretend the screen is off, even if screen state changes");
1094ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn    }
1095ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn
1096cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) {
1097cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        i++;
1098cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        if (i >= args.length) {
1099cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Missing option argument for " + (enable ? "--enable" : "--disable"));
1100cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1101cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1102cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
11030068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) {
1104cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            synchronized (mStats) {
11050068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                mStats.setRecordAllHistoryLocked(enable);
1106cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            }
11079a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn        } else if ("no-auto-reset".equals(args[i])) {
11089a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            synchronized (mStats) {
11099a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn                mStats.setNoAutoReset(enable);
11109a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn            }
1111674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani        } else if ("pretend-screen-off".equals(args[i])) {
1112674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            synchronized (mStats) {
1113674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani                mStats.setPretendScreenOff(enable);
1114674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani            }
1115cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        } else {
1116cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            pw.println("Unknown enable/disable option: " + args[i]);
1117cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            dumpHelp(pw);
1118cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn            return -1;
1119cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        }
1120cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn        return i;
1121cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn    }
1122cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn
11234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    @Override
11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
11266df866a8510af2776c48425a361f708ae7f5d7d6Jeff Sharkey        if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return;
11273abd75ba3a981850cac43a401d0014a836559cb0Kenny Root
1128c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        int flags = 0;
11290068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean useCheckinFormat = false;
11300068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        boolean isRealCheckin = false;
11310ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        boolean noOutput = false;
113216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn        boolean writeData = false;
1133c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn        long historyStart = -1;
1134cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn        int reqUid = -1;
1135e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        if (args != null) {
1136c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn            for (int i=0; i<args.length; i++) {
1137c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                String arg = args[i];
1138e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                if ("--checkin".equals(arg)) {
11390068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
11400068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    isRealCheckin = true;
1141099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn                } else if ("--history".equals(arg)) {
1142c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1143c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--history-start".equals(arg)) {
1144c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_HISTORY_ONLY;
1145c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    i++;
1146c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    if (i >= args.length) {
1147c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        pw.println("Missing time argument for --history-since");
1148c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        dumpHelp(pw);
1149c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                        return;
1150c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    }
1151c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    historyStart = Long.parseLong(args[i]);
115216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    writeData = true;
115349021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn                } else if ("-c".equals(arg)) {
11540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    useCheckinFormat = true;
1155c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_INCLUDE_HISTORY;
1156c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                } else if ("--charged".equals(arg)) {
1157c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                    flags |= BatteryStats.DUMP_CHARGED_ONLY;
1158d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--daily".equals(arg)) {
1159d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    flags |= BatteryStats.DUMP_DAILY_ONLY;
1160e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                } else if ("--reset".equals(arg)) {
1161e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                    synchronized (mStats) {
11623d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn                        mStats.resetAllStatsCmdLocked();
1163e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn                        pw.println("Battery stats reset.");
11640ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
1166b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL);
11670ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                } else if ("--write".equals(arg)) {
1168b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    awaitUninterruptibly(mWorker.scheduleSync("dump",
1169b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                            BatteryExternalStatsWorker.UPDATE_ALL));
11700ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    synchronized (mStats) {
11710ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        mStats.writeSyncLocked();
11720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        pw.println("Battery stats written.");
11730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                        noOutput = true;
11740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    }
1175d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--new-daily".equals(arg)) {
1176d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1177d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.recordDailyStatsLocked();
1178d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("New daily stats written.");
1179d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1180d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1181d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                } else if ("--read-daily".equals(arg)) {
1182d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    synchronized (mStats) {
1183d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        mStats.readDailyStatsLocked();
1184d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        pw.println("Last daily stats read.");
1185d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                        noOutput = true;
1186d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn                    }
1187fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--enable".equals(arg) || "enable".equals(arg)) {
1188cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, true);
1189cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1190cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1191cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1192cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Enabled: " + args[i]);
1193cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1194fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn                } else if ("--disable".equals(arg) || "disable".equals(arg)) {
1195cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    i = doEnableOrDisable(pw, i, args, false);
1196cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    if (i < 0) {
1197cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                        return;
1198cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    }
1199cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    pw.println("Disabled: " + args[i]);
1200cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn                    return;
1201ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                } else if ("-h".equals(arg)) {
1202ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1203ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    return;
1204e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood                } else if ("-a".equals(arg)) {
1205a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn                    flags |= BatteryStats.DUMP_VERBOSE;
1206cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else if (arg.length() > 0 && arg.charAt(0) == '-'){
12070ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn                    pw.println("Unknown option: " + arg);
1208ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn                    dumpHelp(pw);
1209cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    return;
1210cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                } else {
1211cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    // Not an option, last argument must be a package name.
1212cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    try {
1213e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey                        reqUid = mContext.getPackageManager().getPackageUidAsUser(arg,
1214cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                                UserHandle.getCallingUserId());
1215cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    } catch (PackageManager.NameNotFoundException e) {
1216cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        pw.println("Unknown package: " + arg);
1217cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        dumpHelp(pw);
1218cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                        return;
1219cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn                    }
12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1222e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        }
12230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        if (noOutput) {
12240ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn            return;
12250ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn        }
122613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
122713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        long ident = Binder.clearCallingIdentity();
122813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        try {
122913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            if (BatteryStatsHelper.checkWifiOnly(mContext)) {
123013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn                flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY;
123113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            }
123213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            // Fetch data from external sources and update the BatteryStatsImpl object with them.
1233b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL));
123413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn        } finally {
123513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn            Binder.restoreCallingIdentity(ident);
1236d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn        }
123713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn
1238ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        if (reqUid >= 0) {
1239ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // By default, if the caller is only interested in a specific package, then
1240ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            // we only dump the aggregated data since charged.
12411e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn            if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) {
1242ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags |= BatteryStats.DUMP_CHARGED_ONLY;
1243ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                // Also if they are doing -c, we don't want history.
1244ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn                flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY;
1245ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn            }
1246ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn        }
12474b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
12480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn        if (useCheckinFormat) {
12499cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn            List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications(
12500d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani                    PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL);
12510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            if (isRealCheckin) {
12520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // For a real checkin, first we want to prefer to use the last complete checkin
12530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                // file if there is one.
12540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                synchronized (mStats.mCheckinFile) {
12550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    if (mStats.mCheckinFile.exists()) {
12560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        try {
12570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            byte[] raw = mStats.mCheckinFile.readFully();
12580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            if (raw != null) {
12590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                Parcel in = Parcel.obtain();
12600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.unmarshall(raw, 0, raw.length);
12610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.setDataPosition(0);
12620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                BatteryStatsImpl checkinStats = new BatteryStatsImpl(
12634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski                                        null, mStats.mHandler, null);
12640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.readSummaryFromParcel(in);
12650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                in.recycle();
12660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                checkinStats.dumpCheckinLocked(mContext, pw, apps, flags,
12670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                        historyStart);
12680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                mStats.mCheckinFile.delete();
12690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                return;
12700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            }
12719ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski                        } catch (IOException | ParcelFormatException e) {
12720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                            Slog.w(TAG, "Failure reading checkin file "
12730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                                    + mStats.mCheckinFile.getBaseFile(), e);
12740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                        }
12750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                    }
12760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn                }
12770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn            }
127882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
1279e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1280c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
128116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
128216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
128316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1284e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
128582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpCheckinLocked");
1286e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn        } else {
128782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
1288e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            synchronized (mStats) {
1289c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn                mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
129016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                if (writeData) {
129116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                    mStats.writeAsyncLocked();
129216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn                }
1293e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn            }
129482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "end dumpLocked");
12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
12974b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski
1298713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1299713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a particular uid.
1300713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1301713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1302713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler takeUidSnapshot(int requestUid) {
1303713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (requestUid != Binder.getCallingUid()) {
1304713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1305713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1306713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1307713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1308713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1309b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
1310b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    BatteryExternalStatsWorker.UPDATE_ALL));
1311713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1312713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return getHealthStatsForUidLocked(requestUid);
1313713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1314713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
131582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
1316713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1317713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1318713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1319713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1320713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1321713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1322713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1323713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a snapshot of the system health for a number of uids.
1324713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1325713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    @Override
1326713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) {
1327713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (!onlyCaller(requestUids)) {
1328713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            mContext.enforceCallingOrSelfPermission(
1329713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    android.Manifest.permission.BATTERY_STATS, null);
1330713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1331713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        long ident = Binder.clearCallingIdentity();
1332713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        int i=-1;
1333713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        try {
1334b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski            awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids",
1335b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski                    BatteryExternalStatsWorker.UPDATE_ALL));
1336713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            synchronized (mStats) {
1337713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final int N = requestUids.length;
1338713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                final HealthStatsParceler[] results = new HealthStatsParceler[N];
1339713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                for (i=0; i<N; i++) {
1340713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    results[i] = getHealthStatsForUidLocked(requestUids[i]);
1341713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                }
1342713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return results;
1343713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1344713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } catch (Exception ex) {
134582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato            if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
1346713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                    + Arrays.toString(requestUids) + ") i=" + i, ex);
1347713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            throw ex;
1348713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        } finally {
1349713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            Binder.restoreCallingIdentity(ident);
1350713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1351713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1352713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1353713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1354713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Returns whether the Binder.getCallingUid is the only thing in requestUids.
1355713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1356713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    private static boolean onlyCaller(int[] requestUids) {
1357713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int caller = Binder.getCallingUid();
1358713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final int N = requestUids.length;
1359713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        for (int i=0; i<N; i++) {
1360713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            if (requestUids[i] != caller) {
1361713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato                return false;
1362713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            }
1363713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1364713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return true;
1365713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1366713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
1367713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    /**
1368713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     * Gets a HealthStatsParceler for the given uid. You should probably call
1369010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski     * updateExternalStatsSync first.
1370713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato     */
1371713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    HealthStatsParceler getHealthStatsForUidLocked(int requestUid) {
1372713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter();
1373713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS);
1374713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid);
1375713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        if (uid != null) {
1376713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato            writer.writeUid(uidWriter, mStats, uid);
1377713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        }
1378713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato        return new HealthStatsParceler(uidWriter);
1379713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato    }
1380713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato
13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1382