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