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