BatteryStatsService.java revision a1fd057c859573a85ca79b21ea5c3f27423eb0df
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 21e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo; 223abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager; 234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo; 242eccd0262827259d15ceaa0fca975d3243c3a699Makoto Onukiimport android.os.PowerManager.ServiceType; 25455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.os.PowerSaveState; 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; 34cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 37e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock; 38cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle; 39e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shuklaimport android.os.UserManagerInternal; 407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 41a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Rayimport android.os.connectivity.CellularBatteryStats; 42713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler; 43713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter; 44713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats; 4506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo; 4621f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo; 47e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 48e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager; 498a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 50674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani 5132dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats; 52d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper; 5332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl; 54e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile; 5550df711a5125460acb8d2960ffc0a1f17a818103Bookatzimport com.android.internal.os.RpmStats; 56fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeyimport com.android.internal.util.DumpUtils; 57cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices; 587ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yuimport android.util.StatsLog; 5932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException; 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 64515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer; 65515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer; 66515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder; 67515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction; 68515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets; 69713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays; 70e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List; 71b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.ExecutionException; 72b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.Future; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 78cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub 7968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan implements PowerManagerInternal.LowPowerModeListener, 8068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan BatteryStatsImpl.PlatformIdleStateCallback { 81c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn static final String TAG = "BatteryStatsService"; 8282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato static final boolean DBG = false; 83c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 84010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private static IBatteryStats sService; 85010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl mStats; 87e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider; 88b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski private final Context mContext; 89b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski private final BatteryExternalStatsWorker mWorker; 904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 9150df711a5125460acb8d2960ffc0a1f17a818103Bookatz private native void getLowPowerStats(RpmStats rpmStats); 9268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private native int getPlatformLowPowerStats(ByteBuffer outBuffer); 93d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy private native int getSubsystemLowPowerStats(ByteBuffer outBuffer); 9468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8 9568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .newDecoder() 9668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .onMalformedInput(CodingErrorAction.REPLACE) 9768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .onUnmappableCharacter(CodingErrorAction.REPLACE) 9868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .replaceWith("?"); 9968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE); 10068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE); 10168cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private static final int MAX_LOW_POWER_STATS_SIZE = 512; 10268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 10350df711a5125460acb8d2960ffc0a1f17a818103Bookatz /** 10450df711a5125460acb8d2960ffc0a1f17a818103Bookatz * Replaces the information in the given rpmStats with up-to-date information. 10550df711a5125460acb8d2960ffc0a1f17a818103Bookatz */ 10650df711a5125460acb8d2960ffc0a1f17a818103Bookatz @Override 10750df711a5125460acb8d2960ffc0a1f17a818103Bookatz public void fillLowPowerStats(RpmStats rpmStats) { 10850df711a5125460acb8d2960ffc0a1f17a818103Bookatz if (DBG) Slog.d(TAG, "begin getLowPowerStats"); 10950df711a5125460acb8d2960ffc0a1f17a818103Bookatz try { 11050df711a5125460acb8d2960ffc0a1f17a818103Bookatz getLowPowerStats(rpmStats); 11150df711a5125460acb8d2960ffc0a1f17a818103Bookatz } finally { 11250df711a5125460acb8d2960ffc0a1f17a818103Bookatz if (DBG) Slog.d(TAG, "end getLowPowerStats"); 11350df711a5125460acb8d2960ffc0a1f17a818103Bookatz } 11450df711a5125460acb8d2960ffc0a1f17a818103Bookatz } 11550df711a5125460acb8d2960ffc0a1f17a818103Bookatz 11668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan @Override 11768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan public String getPlatformLowPowerStats() { 11882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats"); 119cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski try { 120cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf8BufferStat.clear(); 121cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf16BufferStat.clear(); 122cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mDecoderStat.reset(); 123cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat); 124cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski if (bytesWritten < 0) { 125cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return null; 126cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } else if (bytesWritten == 0) { 127cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return "Empty"; 128cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } 129cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf8BufferStat.limit(bytesWritten); 130cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true); 131cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf16BufferStat.flip(); 132cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return mUtf16BufferStat.toString(); 133cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } finally { 13482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats"); 13568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } 13668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } 13768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 138d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy @Override 139d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy public String getSubsystemLowPowerStats() { 14050df711a5125460acb8d2960ffc0a1f17a818103Bookatz if (DBG) Slog.d(TAG, "begin getSubsystemLowPowerStats"); 141d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy try { 142d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mUtf8BufferStat.clear(); 143d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mUtf16BufferStat.clear(); 144d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mDecoderStat.reset(); 145d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy int bytesWritten = getSubsystemLowPowerStats(mUtf8BufferStat); 146d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy if (bytesWritten < 0) { 147d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy return null; 148d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } else if (bytesWritten == 0) { 149d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy return "Empty"; 150d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } 151d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mUtf8BufferStat.limit(bytesWritten); 152d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true); 153d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mUtf16BufferStat.flip(); 154d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy return mUtf16BufferStat.toString(); 155d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } finally { 15650df711a5125460acb8d2960ffc0a1f17a818103Bookatz if (DBG) Slog.d(TAG, "end getSubsystemLowPowerStats"); 157d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } 158d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } 159d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy 160b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryStatsService(Context context, File systemDir, Handler handler) { 1614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through. 162b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mContext = context; 163e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() { 164e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla private UserManagerInternal umi; 165e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla @Override 166e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla public int[] getUserIds() { 167e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla if (umi == null) { 168e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla umi = LocalServices.getService(UserManagerInternal.class); 169e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 170e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla return (umi != null) ? umi.getUserIds() : null; 171e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 172e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla }; 173e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla mStats = new BatteryStatsImpl(systemDir, handler, this, mUserManagerUserInfoProvider); 174b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker = new BatteryExternalStatsWorker(context, mStats); 175b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.setExternalStatsSyncLocked(mWorker); 176b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger( 177b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski com.android.internal.R.integer.config_radioScanningTimeout) * 1000L); 178b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.setPowerProfileLocked(new PowerProfile(context)); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 181b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski public void publish() { 182c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen LocalServices.addService(BatteryStatsInternal.class, new LocalService()); 1836832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder()); 1842c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 1852c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 186c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen private final class LocalService extends BatteryStatsInternal { 187c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen @Override 188c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen public String[] getWifiIfaces() { 189c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen return mStats.getWifiIfaces().clone(); 190c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen } 191c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen 192c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen @Override 193c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen public String[] getMobileIfaces() { 194c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen return mStats.getMobileIfaces().clone(); 195c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen } 196c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen } 197c8a4324855ff31f605fe28342673945dbf413e8dDavid Chen 198b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski private static void awaitUninterruptibly(Future<?> future) { 199b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski while (true) { 200b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski try { 201b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski future.get(); 202b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski return; 203b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } catch (ExecutionException e) { 204b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski return; 205b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } catch (InterruptedException e) { 206b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // Keep looping 207b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } 208b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } 209b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } 210b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski 2112c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown /** 2122c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * At the time when the constructor runs, the power manager has not yet been 2132c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * initialized. So we initialize the low power observer later. 2142c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown */ 2152c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown public void initPowerManagement() { 216010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class); 217010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski powerMgr.registerLowPowerModeObserver(this); 21814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski synchronized (mStats) { 21914ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski mStats.notePowerSaveModeLocked( 22014ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski powerMgr.getLowPowerState(ServiceType.BATTERY_STATS) 22114ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski .batterySaverEnabled); 22214ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski } 223c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn (new WakeupReasonThread()).start(); 2242c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 2252c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 22655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn public void shutdown() { 2278a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w("BatteryStats", "Writing battery stats before shutdown..."); 2284b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 229b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("shutdown", BatteryExternalStatsWorker.UPDATE_ALL)); 230b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski 23155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn synchronized (mStats) { 2326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.shutdownLocked(); 23355280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 23420b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski 23520b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski // Shutdown the thread we made. 236b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.shutdown(); 23755280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 2382f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static IBatteryStats getService() { 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24391268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = asInterface(b); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 247cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 248cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn @Override 249455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public int getServiceType() { 250455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return ServiceType.BATTERY_STATS; 251455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 252455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 253455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei @Override 254455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public void onLowPowerModeChanged(PowerSaveState result) { 255cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 25614ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski mStats.notePowerSaveModeLocked(result.batterySaverEnabled); 257cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 258cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 259cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current statistics object, which may be modified 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to reflect events that affect battery usage. You must lock the 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stats object before doing anything with it. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getActiveStatistics() { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 2694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 2704b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Schedules a write to disk to occur. This will cause the BatteryStatsImpl 2714b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * object to update with the latest info, then write to disk. 2724b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 2734b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void scheduleWriteToDisk() { 274b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleWrite(); 2754b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 2764b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 2772f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // These are for direct use by the activity manager... 2782f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 279b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski /** 280b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski * Remove a UID from the BatteryStats and BatteryStats' external dependencies. 281b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski */ 282b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski void removeUid(int uid) { 283b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski synchronized (mStats) { 284b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski mStats.removeUidStatsLocked(uid); 285b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 286b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 287b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski 288e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla void onCleanupUser(int userId) { 289e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla synchronized (mStats) { 290e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla mStats.onCleanupUserLocked(userId); 291e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 292e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 293e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla 294e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla void onUserRemoved(int userId) { 295e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla synchronized (mStats) { 296e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla mStats.onUserRemovedLocked(userId); 297e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 298e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 299e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla 3002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void addIsolatedUid(int isolatedUid, int appUid) { 3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 3022f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.addIsolatedUidLocked(isolatedUid, appUid); 3032f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3042f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3052f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3062f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void removeIsolatedUid(int isolatedUid, int appUid) { 3072f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 30861db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid); 3092f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3102f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3112f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3122f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void noteProcessStart(String name, int uid) { 3132f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 3142f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.noteProcessStartLocked(name, uid); 315c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz // TODO: decide where this should be and use a constant instead of a literal. 316c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 1); 3172f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3192f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3201e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessCrash(String name, int uid) { 3211e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 3221e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessCrashLocked(name, uid); 323c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz // TODO: decide where this should be and use a constant instead of a literal. 324c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 2); 3251e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3261e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3271e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 3281e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessAnr(String name, int uid) { 3291e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 3301e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessAnrLocked(name, uid); 331c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz // TODO: decide where this should be and use a constant instead of a literal. 332c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 3); 3331e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3341e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3351e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 336a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteProcessFinish(String name, int uid) { 3372f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 338a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteProcessFinishLocked(name, uid); 339c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz // TODO: decide where this should be and use a constant instead of a literal. 340c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz StatsLog.write(StatsLog.PROCESS_LIFE_CYCLE_STATE_CHANGED, uid, name, 0); 3412f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3422f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3432f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 344a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteUidProcessState(int uid, int state) { 3452f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 346d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen // TODO: remove this once we figure out properly where and how 347c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz StatsLog.write(StatsLog.UID_PROCESS_STATE_CHANGED, uid, state); 348d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen 349a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteUidProcessStateLocked(uid, state); 3502f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3512f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3522f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3532f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // Public interface... 3542f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getStatistics() { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingPermission( 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 3588a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i("foo", "SENDING BATTERY INFO:"); 3598a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 361b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL)); 3624b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 3634b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3644b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = out.marshall(); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn public ParcelFileDescriptor getStatisticsStream() { 3710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mContext.enforceCallingPermission( 3720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn android.Manifest.permission.BATTERY_STATS, null); 3730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //Slog.i("foo", "SENDING BATTERY INFO:"); 3740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 3750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel out = Parcel.obtain(); 376b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL)); 3774b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 3784b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3794b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] data = out.marshall(); 3810068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn out.recycle(); 3820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 3830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return ParcelFileDescriptor.fromData(data, "battery-stats"); 3840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } catch (IOException e) { 3850068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Unable to create shared memory", e); 3860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return null; 3870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3880068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3890068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3904870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn public boolean isCharging() { 3914870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn synchronized (mStats) { 3924870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn return mStats.isCharging(); 3934870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3944870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3954870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn 396ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeBatteryTimeRemaining() { 397ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 398ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime()); 399ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 400ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 401ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 402ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 403ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeChargeTimeRemaining() { 404ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 405ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime()); 406ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 407ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 408ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 409ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 410099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn public void noteEvent(int code, String name, int uid) { 411099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn enforceCallingPermission(); 412099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn synchronized (mStats) { 413099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn mStats.noteEventLocked(code, name, uid); 414099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 415099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 416099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncStart(String name, int uid) { 418fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 419fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 420fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncStartLocked(name, uid); 421fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 422fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 423fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 424fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncFinish(String name, int uid) { 425fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 426fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 427fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncFinishLocked(name, uid); 428fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 429fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 430fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 431fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobStart(String name, int uid) { 432fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 433fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 434fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobStartLocked(name, uid); 435fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 436fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 437fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 43894326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn public void noteJobFinish(String name, int uid, int stopReason) { 439fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 440fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 44194326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn mStats.noteJobFinishLocked(name, uid, stopReason); 442fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 443fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 444fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 4451e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmStart(String name, int uid) { 4461e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 4471e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 4481e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmStartLocked(name, uid); 4491e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4501e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4511e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 4521e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmFinish(String name, int uid) { 4531e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 4541e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 4551e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmFinishLocked(name, uid); 4561e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4571e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4581e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 459a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelock(int uid, int pid, String name, String historyName, int type, 4603d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn boolean unimportantForLogging) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 463e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging, 46440c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 468cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 471cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeLocked(uid, pid, name, historyName, type, 472cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 476a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelockFromSource(WorkSource ws, int pid, String name, 477a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn String historyName, int type, boolean unimportantForLogging) { 4787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 480a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName, 481a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn type, unimportantForLogging); 4827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 485cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name, 486cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn String historyName, int type, WorkSource newWs, int newPid, String newName, 487e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn String newHistoryName, int newType, boolean newUnimportantForLogging) { 488e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn enforceCallingPermission(); 489e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn synchronized (mStats) { 490cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type, 491e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging); 492e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 493e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 494e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 495cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName, 496cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn int type) { 4977e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 499cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type); 5007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 5027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 503d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn public void noteLongPartialWakelockStart(String name, String historyName, int uid) { 504d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn enforceCallingPermission(); 505d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn synchronized (mStats) { 506d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn mStats.noteLongPartialWakelockStart(name, historyName, uid); 507d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 508d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 509d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn 510d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn public void noteLongPartialWakelockFinish(String name, String historyName, int uid) { 511d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn enforceCallingPermission(); 512d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn synchronized (mStats) { 513d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn mStats.noteLongPartialWakelockFinish(name, historyName, uid); 514d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 515d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 516d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int uid, int sensor) { 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5209adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStartSensorLocked(uid, sensor); 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52329fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int uid, int sensor) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5279adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStopSensorLocked(uid, sensor); 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53029fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 531a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOn(int uid, long durationMillis) { 532a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 533a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 534a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOnLocked(uid, durationMillis); 535a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 536a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 537a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 538a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOff(int uid) { 539a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 540a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 541a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOffLocked(uid); 542a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 543a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 544a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5486b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStartGpsLocked(uid); 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55129fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5556b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStopGpsLocked(uid); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 55829fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 559e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteScreenState(int state) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 56182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin noteScreenState"); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 563931945399859ab91545ba2c2a914f044092d5e2eJoe Onorato // TODO: remove this once we figure out properly where and how 564d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen StatsLog.write(StatsLog.SCREEN_STATE_CHANGED, state); 565d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen 566d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen mStats.noteScreenStateLocked(state); 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 56882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end noteScreenState"); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57029fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightness(int brightness) { 572617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 573617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 574c1a050ad32246e0f7a7cb60c96eda197e2715f04Bookatz StatsLog.write(StatsLog.SCREEN_BRIGHTNESS_CHANGED, brightness); 575617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteScreenBrightnessLocked(brightness); 576617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 577617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 578e03583e261227d76ec4dec3d4e9dc9488a0623ccyro 579e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteUserActivity(int uid, int event) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 582e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteUserActivityLocked(uid, event); 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 585e03583e261227d76ec4dec3d4e9dc9488a0623ccyro 586280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn public void noteWakeUp(String reason, int reasonUid) { 587280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn enforceCallingPermission(); 588280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn synchronized (mStats) { 589280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn mStats.noteWakeUpLocked(reason, reasonUid); 590280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 591280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 592280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn 593e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteInteractive(boolean interactive) { 594617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 595617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 596e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteInteractiveLocked(interactive); 597617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 598617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 599e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 6001e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn public void noteConnectivityChanged(int type, String extra) { 6011e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn enforceCallingPermission(); 6021e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 6031e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteConnectivityChangedLocked(type, extra); 6041e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 6051e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 6061e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 607fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) { 608e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn enforceCallingPermission(); 609b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski final boolean update; 610e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn synchronized (mStats) { 61114ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid); 61214ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski } 61314ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski 61414ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski if (update) { 615b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("modem-data", BatteryExternalStatsWorker.UPDATE_RADIO); 616e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 617e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 618e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOn() { 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOnLocked(); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6252f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOff() { 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOffLocked(); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6322f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 633e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrength(SignalStrength signalStrength) { 634627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 635627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 636e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mStats.notePhoneSignalStrengthLocked(signalStrength); 637627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 638627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 6392f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 640627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionState(int dataType, boolean hasData) { 641627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 642627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 643627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mStats.notePhoneDataConnectionStateLocked(dataType, hasData); 644627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 645627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 64632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 647f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneState(int state) { 64832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani enforceCallingPermission(); 649e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int simState = TelephonyManager.getDefault().getSimState(); 65032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani synchronized (mStats) { 651e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mStats.notePhoneStateLocked(state, simState); 65232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 65332dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 65432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 65558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOn() { 656105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 657105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 65858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOnLocked(); 659105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 660105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 6612f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 66258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOff() { 663105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 664105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 66558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOffLocked(); 666105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 667105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 668d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 669244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartAudio(int uid) { 670244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 671244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 672244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOnLocked(uid); 673244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 674244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 675244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 676244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopAudio(int uid) { 677244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 678244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 679244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOffLocked(uid); 680244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 681244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 682244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 683244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartVideo(int uid) { 684244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 685244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 686244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOnLocked(uid); 687244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 688244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 689244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 690244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopVideo(int uid) { 691244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 692244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 693244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOffLocked(uid); 694244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 695244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 696244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 69710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetAudio() { 69810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 69910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 70010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetAudioLocked(); 70110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 70210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 70310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 70410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetVideo() { 70510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 70610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 70710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetVideoLocked(); 70810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 70910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 71010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 7116d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOn(int uid) { 712abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 713abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 7146d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOnLocked(uid); 715abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 716abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 717abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 7186d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOff(int uid) { 719abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 720abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 7216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOffLocked(uid); 7226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7246d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStartCamera(int uid) { 7266d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 72782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin noteStartCamera"); 7286d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7296d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOnLocked(uid); 7306d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 73182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end noteStartCamera"); 7326d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7336d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7346d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStopCamera(int uid) { 7356d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7366d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7376d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOffLocked(uid); 7386d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7396d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7406d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7416d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetCamera() { 7426d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7436d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7446d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetCameraLocked(); 7456d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7466d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7476d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7486d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetFlashlight() { 7496d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7506d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7516d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetFlashlightLocked(); 752abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 753abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 754abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 755e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski @Override 7565f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) { 757e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski enforceCallingPermission(); 758e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 759e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // There was a change in WiFi power state. 760e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Collect data now for the past activity. 7610c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn synchronized (mStats) { 762a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if (mStats.isOnBattery()) { 76306f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH || 76406f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active" 76506f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski : "inactive"; 766b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("wifi-data: " + type, BatteryExternalStatsWorker.UPDATE_WIFI); 767a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 7685f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski mStats.noteWifiRadioPowerState(powerState, tsNanos, uid); 7690c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn } 770e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 771e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 77258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunning(WorkSource ws) { 773d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 774d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 77558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningLocked(ws); 776d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 777d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 778d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 77958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) { 780d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 781d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 78258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningChangedLocked(oldWs, newWs); 78358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 78458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 78558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 78658e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStopped(WorkSource ws) { 78758e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn enforceCallingPermission(); 78858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn synchronized (mStats) { 78958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiStoppedLocked(ws); 790d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 791d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 792d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 793ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn public void noteWifiState(int wifiState, String accessPoint) { 794ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn enforceCallingPermission(); 795ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn synchronized (mStats) { 796ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn mStats.noteWifiStateLocked(wifiState, accessPoint); 797ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 798ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 799ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn 8003251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) { 8013251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 8023251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 8033251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth); 8043251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 8053251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 8063251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 8073251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiRssiChanged(int newRssi) { 8083251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 8093251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 8103251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiRssiChangedLocked(newRssi); 8113251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 8123251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 8133251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 814105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquired(int uid) { 815105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 817105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockAcquiredLocked(uid); 818105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 819105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8202f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 821105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleased(int uid) { 822105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 823105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 824105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockReleasedLocked(uid); 825105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 826105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8276ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 8286ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStarted(int uid) { 829105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 830105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 8316ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedLocked(uid); 832105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 833105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8346ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 8356ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStopped(int uid) { 836105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 837105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 8386ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedLocked(uid); 839105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 840105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8425347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabled(int uid) { 8435347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 8445347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 8455347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastEnabledLocked(uid); 8465347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8475347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8485347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8495347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabled(int uid) { 8505347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 8515347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 8525347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastDisabledLocked(uid); 8535347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8545347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8555347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSource(WorkSource ws) { 8577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockAcquiredFromSourceLocked(ws); 8607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8627e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8637e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSource(WorkSource ws) { 8647e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8667e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockReleasedFromSourceLocked(ws); 8677e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8687e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8697e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8706ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedFromSource(WorkSource ws) { 8717e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8727e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8736ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedFromSourceLocked(ws); 8747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8776ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedFromSource(WorkSource ws) { 8787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8806ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedFromSourceLocked(ws); 8817e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 884a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) { 885a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 886a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 887a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph); 888a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 889a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 890a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 891a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) { 892a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 893a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 894a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws); 895a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 896a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 897a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 8987e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSource(WorkSource ws) { 8997e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 9007e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 9017e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastEnabledFromSourceLocked(ws); 9027e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 9037e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 9047e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 9054b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 9067e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSource(WorkSource ws) { 9077e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 9087e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 9097e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastDisabledFromSourceLocked(ws); 9107e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 9117e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 9127e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 9137a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 9144b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void noteNetworkInterfaceType(String iface, int networkType) { 9151059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey enforceCallingPermission(); 9161059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (mStats) { 9174b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.noteNetworkInterfaceTypeLocked(iface, networkType); 9181059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 9191059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 9201059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 9217a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 9227a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey public void noteNetworkStatsEnabled() { 9237a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey enforceCallingPermission(); 924b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // During device boot, qtaguid isn't enabled until after the inital 925b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // loading of battery stats. Now that they're enabled, take our initial 926b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // snapshot for future delta calculation. 927b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("network-stats-enabled", 928b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryExternalStatsWorker.UPDATE_RADIO | BatteryExternalStatsWorker.UPDATE_WIFI); 9297a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 9307a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey 9318ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn @Override 93208c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) { 9338ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9348ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 93508c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid); 9368ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9378ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9388ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9393accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn public void notePackageInstalled(String pkgName, long versionCode) { 9408ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9418ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 9428ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageInstalledLocked(pkgName, versionCode); 9438ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9448ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9458ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9468ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageUninstalled(String pkgName) { 9478ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9488ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 9498ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageUninstalledLocked(pkgName); 9508ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9518ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9528ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9536771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski @Override 954b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) { 9556771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski enforceCallingPermission(); 9569f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 957b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized); 9589f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9596771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9606771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 9616771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski @Override 96294c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz public void noteBleScanStopped(WorkSource ws, boolean isUnoptimized) { 9636771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski enforceCallingPermission(); 9649f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 96594c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz mStats.noteBluetoothScanStoppedFromSourceLocked(ws, isUnoptimized); 9669f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9679f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9689f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski 9699f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski @Override 9709f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski public void noteResetBleScan() { 9719f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski enforceCallingPermission(); 9729f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 9739f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mStats.noteResetBluetoothScanLocked(); 9749f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 975956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz } 976956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz 977956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz @Override 9784ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz public void noteBleScanResults(WorkSource ws, int numNewResults) { 979956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz enforceCallingPermission(); 980956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz synchronized (mStats) { 9814ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz mStats.noteBluetoothScanResultsFromSourceLocked(ws, numNewResults); 982956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz } 9836771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9846771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 985010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 986010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteWifiControllerActivity(WifiActivityEnergyInfo info) { 987010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 988010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 989010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 990010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid wifi data given: " + info); 991010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 992010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 993010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 99414ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski mStats.updateWifiState(info); 995010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 996010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 997010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 998010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) { 999010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 1000010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 1001010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid bluetooth data given: " + info); 1002010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 1003010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1004010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1005b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.updateBluetoothStateLocked(info); 1006010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1007010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1008010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 1009010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteModemControllerActivity(ModemActivityInfo info) { 1010010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 1011010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 1012010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 1013010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid modem data given: " + info); 1014010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 1015010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1016010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 101714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski mStats.updateMobileRadioState(info); 1018010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 1019010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.isOnBattery(); 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1024d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski @Override 1025d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski public void setBatteryState(final int status, final int health, final int plugType, 1026041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski final int level, final int temp, final int volt, final int chargeUAh, 1027041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski final int chargeFullUAh) { 1028d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski enforceCallingPermission(); 1029d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 1030d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // BatteryService calls us here and we may update external state. It would be wrong 1031d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // to block such a low level service like BatteryService on external stats like WiFi. 1032b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleRunnable(() -> { 1033b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski synchronized (mStats) { 1034b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE; 1035b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski if (mStats.isOnBattery() == onBattery) { 1036b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // The battery state has not changed, so we don't need to sync external 1037b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // stats immediately. 1038b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt, 1039b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski chargeUAh, chargeFullUAh); 1040b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski return; 1041d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1042b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } 1043d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 1044b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // Sync external stats first as the battery has changed states. If we don't sync 1045b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // before changing the state, we may not collect the relevant data later. 1046b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // Order here is guaranteed since we're scheduling from the same thread and we are 1047b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // using a single threaded executor. 1048b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("battery-state", BatteryExternalStatsWorker.UPDATE_ALL); 1049b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleRunnable(() -> { 1050d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski synchronized (mStats) { 1051926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt, 1052041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski chargeUAh, chargeFullUAh); 1053d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1054b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski }); 1055d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski }); 1056633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 10572f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimeBattery(); 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimePlugged(); 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission() { 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS, 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingPid(), Binder.getCallingUid(), null); 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1077c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1078c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final class WakeupReasonThread extends Thread { 1079515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static final int MAX_REASON_SIZE = 512; 1080515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharsetDecoder mDecoder; 1081515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private ByteBuffer mUtf8Buffer; 1082515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharBuffer mUtf16Buffer; 1083c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1084c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn WakeupReasonThread() { 1085c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn super("BatteryStats_wakeupReason"); 1086c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1087c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1088c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn public void run() { 1089c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND); 1090c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1091515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder = StandardCharsets.UTF_8 1092515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .newDecoder() 1093515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onMalformedInput(CodingErrorAction.REPLACE) 1094515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onUnmappableCharacter(CodingErrorAction.REPLACE) 1095515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .replaceWith("?"); 1096515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1097515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE); 1098515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE); 1099515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1100c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn try { 1101515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski String reason; 1102515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski while ((reason = waitWakeup()) != null) { 1103c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn synchronized (mStats) { 1104515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mStats.noteWakeupReasonLocked(reason); 1105c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1106c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1107c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } catch (RuntimeException e) { 1108c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Slog.e(TAG, "Failure reading wakeup reasons", e); 1109c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1110c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1111515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1112515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private String waitWakeup() { 1113515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.clear(); 1114515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.clear(); 1115515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.reset(); 1116515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1117515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski int bytesWritten = nativeWaitWakeup(mUtf8Buffer); 1118515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (bytesWritten < 0) { 1119515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return null; 1120515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } else if (bytesWritten == 0) { 1121515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return "unknown"; 1122515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1123515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1124515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Set the buffer's limit to the number of bytes written. 1125515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.limit(bytesWritten); 1126515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1127515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Decode the buffer from UTF-8 to UTF-16. 1128515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Unmappable characters will be replaced. 1129515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true); 1130515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.flip(); 1131515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1132515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Create a String from the UTF-16 buffer. 1133515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return mUtf16Buffer.toString(); 1134515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1135c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1136c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1137515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static native int nativeWaitWakeup(ByteBuffer outBuffer); 1138c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1139ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn private void dumpHelp(PrintWriter pw) { 114091268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn pw.println("Battery stats (batterystats) dump options:"); 11411e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn pw.println(" [--checkin] [--history] [--history-start] [--charged] [-c]"); 1142d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]"); 1143865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" --checkin: generate output for a checkin report; will write (and clear) the"); 1144865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" last old completed stats when they had been reset."); 11451476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato pw.println(" -c: write the current stats in checkin format."); 1146099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn pw.println(" --history: show only history data."); 1147c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --history-start <num>: show only history data starting at given time offset."); 1148c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --charged: only output data since last charged."); 1149d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --daily: only output full daily data."); 1150ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --reset: reset the stats, clearing all current data."); 1151ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --write: force write current collected stats to disk."); 1152d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --new-daily: immediately create and write new daily stats record."); 1153d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --read-daily: read-load last written daily stats."); 1154cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println(" <package.name>: optional name of package to filter output by."); 1155fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" -h: print this help text."); 1156fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println("Battery stats (batterystats) commands:"); 1157fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" enable|disable <option>"); 1158fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Enable or disable a running option. Option state is not saved across boots."); 1159fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Options are:"); 11600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn pw.println(" full-history: include additional detailed events in battery history:"); 11611e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn pw.println(" wake_lock_in, alarms and proc events"); 1162fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" no-auto-reset: don't automatically reset stats when unplugged"); 1163674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani pw.println(" pretend-screen-off: pretend the screen is off, even if screen state changes"); 1164ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 1165ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 1166cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) { 1167cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i++; 1168cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i >= args.length) { 1169cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Missing option argument for " + (enable ? "--enable" : "--disable")); 1170cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1171cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1172cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 11730068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) { 1174cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 11750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.setRecordAllHistoryLocked(enable); 1176cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 11779a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } else if ("no-auto-reset".equals(args[i])) { 11789a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn synchronized (mStats) { 11799a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn mStats.setNoAutoReset(enable); 11809a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } 1181674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani } else if ("pretend-screen-off".equals(args[i])) { 1182674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani synchronized (mStats) { 1183674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani mStats.setPretendScreenOff(enable); 1184674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani } 1185cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else { 1186cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Unknown enable/disable option: " + args[i]); 1187cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1188cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1189cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1190cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return i; 1191cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1192cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 11934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 11966df866a8510af2776c48425a361f708ae7f5d7d6Jeff Sharkey if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return; 11973abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 1198c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn int flags = 0; 11990068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean useCheckinFormat = false; 12002f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams boolean toProto = false; 12010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean isRealCheckin = false; 12020ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean noOutput = false; 120316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn boolean writeData = false; 1204c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn long historyStart = -1; 1205cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn int reqUid = -1; 1206e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (args != null) { 1207c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn for (int i=0; i<args.length; i++) { 1208c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn String arg = args[i]; 1209e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ("--checkin".equals(arg)) { 12100068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 12110068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn isRealCheckin = true; 1212099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } else if ("--history".equals(arg)) { 1213c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1214c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--history-start".equals(arg)) { 1215c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1216c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn i++; 1217c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (i >= args.length) { 1218c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println("Missing time argument for --history-since"); 1219c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn dumpHelp(pw); 1220c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn return; 1221c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1222c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn historyStart = Long.parseLong(args[i]); 122316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn writeData = true; 122449021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn } else if ("-c".equals(arg)) { 12250068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 1226c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_INCLUDE_HISTORY; 12272f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } else if ("--proto".equals(arg)) { 12282f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams toProto = true; 1229c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--charged".equals(arg)) { 1230c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1231d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--daily".equals(arg)) { 1232d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn flags |= BatteryStats.DUMP_DAILY_ONLY; 1233e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("--reset".equals(arg)) { 1234e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 12353d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn mStats.resetAllStatsCmdLocked(); 1236e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pw.println("Battery stats reset."); 12370ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1239b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL); 12400ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ("--write".equals(arg)) { 1241b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("dump", 1242b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryExternalStatsWorker.UPDATE_ALL)); 12430ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn synchronized (mStats) { 12440ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mStats.writeSyncLocked(); 12450ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Battery stats written."); 12460ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 12470ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 1248d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--new-daily".equals(arg)) { 1249d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1250d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.recordDailyStatsLocked(); 1251d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("New daily stats written."); 1252d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1253d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1254d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--read-daily".equals(arg)) { 1255d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1256d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.readDailyStatsLocked(); 1257d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("Last daily stats read."); 1258d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1259d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1260fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--enable".equals(arg) || "enable".equals(arg)) { 1261cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, true); 1262cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1263cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1264cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1265cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Enabled: " + args[i]); 1266cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1267fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--disable".equals(arg) || "disable".equals(arg)) { 1268cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, false); 1269cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1270cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1271cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1272cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Disabled: " + args[i]); 1273cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1274ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } else if ("-h".equals(arg)) { 1275ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1276ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn return; 1277e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood } else if ("-a".equals(arg)) { 1278a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn flags |= BatteryStats.DUMP_VERBOSE; 1279cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else if (arg.length() > 0 && arg.charAt(0) == '-'){ 12800ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Unknown option: " + arg); 1281ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1282cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1283cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else { 1284cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn // Not an option, last argument must be a package name. 1285cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn try { 1286e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey reqUid = mContext.getPackageManager().getPackageUidAsUser(arg, 1287cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn UserHandle.getCallingUserId()); 1288cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 1289cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println("Unknown package: " + arg); 1290cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn dumpHelp(pw); 1291cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1292cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1295e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 12960ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (noOutput) { 12970ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12980ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 129913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 130013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn long ident = Binder.clearCallingIdentity(); 130113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn try { 130213a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn if (BatteryStatsHelper.checkWifiOnly(mContext)) { 130313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY; 130413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } 130513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn // Fetch data from external sources and update the BatteryStatsImpl object with them. 1306b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL)); 130713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } finally { 130813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn Binder.restoreCallingIdentity(ident); 1309d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn } 131013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 1311ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn if (reqUid >= 0) { 1312ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // By default, if the caller is only interested in a specific package, then 1313ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // we only dump the aggregated data since charged. 13141e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) { 1315ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1316ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // Also if they are doing -c, we don't want history. 1317ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY; 1318ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 1319ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 13204b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 13212f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (toProto) { 13222f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications( 13232f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL); 13242f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (isRealCheckin) { 13252f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams // For a real checkin, first we want to prefer to use the last complete checkin 13262f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams // file if there is one. 13272f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams synchronized (mStats.mCheckinFile) { 13282f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (mStats.mCheckinFile.exists()) { 13292f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams try { 13302f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams byte[] raw = mStats.mCheckinFile.readFully(); 13312f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (raw != null) { 13322f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams Parcel in = Parcel.obtain(); 13332f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams in.unmarshall(raw, 0, raw.length); 13342f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams in.setDataPosition(0); 13352f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams BatteryStatsImpl checkinStats = new BatteryStatsImpl( 13362f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams null, mStats.mHandler, null, mUserManagerUserInfoProvider); 13372f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams checkinStats.readSummaryFromParcel(in); 13382f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams in.recycle(); 13396ccebf23933c3bb8a79623e6ce190afdb150cb31Kweku Adams checkinStats.dumpProtoLocked(mContext, fd, apps, flags); 13402f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams mStats.mCheckinFile.delete(); 13412f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams return; 13422f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13432f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } catch (IOException | ParcelFormatException e) { 13442f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams Slog.w(TAG, "Failure reading checkin file " 13452f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams + mStats.mCheckinFile.getBaseFile(), e); 13462f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13472f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13482f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13492f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13502f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (DBG) Slog.d(TAG, "begin dumpProtoLocked from UID " + Binder.getCallingUid()); 13512f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams synchronized (mStats) { 13526ccebf23933c3bb8a79623e6ce190afdb150cb31Kweku Adams mStats.dumpProtoLocked(mContext, fd, apps, flags); 13532f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (writeData) { 13542f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams mStats.writeAsyncLocked(); 13552f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13562f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13572f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (DBG) Slog.d(TAG, "end dumpProtoLocked"); 13582f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } else if (useCheckinFormat) { 13599cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications( 13600d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL); 13610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (isRealCheckin) { 13620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // For a real checkin, first we want to prefer to use the last complete checkin 13630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // file if there is one. 13640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn synchronized (mStats.mCheckinFile) { 13650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (mStats.mCheckinFile.exists()) { 13660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 13670068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] raw = mStats.mCheckinFile.readFully(); 13680068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (raw != null) { 13690068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel in = Parcel.obtain(); 13700068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.unmarshall(raw, 0, raw.length); 13710068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.setDataPosition(0); 13720068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsImpl checkinStats = new BatteryStatsImpl( 1373e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla null, mStats.mHandler, null, mUserManagerUserInfoProvider); 13740068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.readSummaryFromParcel(in); 13750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.recycle(); 13760068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.dumpCheckinLocked(mContext, pw, apps, flags, 13770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn historyStart); 13780068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.mCheckinFile.delete(); 13790068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return; 13800068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13819ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski } catch (IOException | ParcelFormatException e) { 13820068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Failure reading checkin file " 13830068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn + mStats.mCheckinFile.getBaseFile(), e); 13840068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13850068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 138882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid()); 1389e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1390c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart); 139116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 139216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 139316b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1394e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 139582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end dumpCheckinLocked"); 1396e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 139782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid()); 1398e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1399c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart); 140016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 140116b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 140216b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1403e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 140482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end dumpLocked"); 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14074b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1408713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1409a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray * Gets a snapshot of cellular stats 1410a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray * @hide 1411a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray */ 1412a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray public CellularBatteryStats getCellularBatteryStats() { 1413a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray synchronized (mStats) { 1414a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray return mStats.getCellularBatteryStats(); 1415a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray } 1416a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray } 1417a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray 1418a1fd057c859573a85ca79b21ea5c3f27423eb0dfSiddharth Ray /** 1419713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a snapshot of the system health for a particular uid. 1420713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1421713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato @Override 1422713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato public HealthStatsParceler takeUidSnapshot(int requestUid) { 1423713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (requestUid != Binder.getCallingUid()) { 1424713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato mContext.enforceCallingOrSelfPermission( 1425713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato android.Manifest.permission.BATTERY_STATS, null); 1426713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1427713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato long ident = Binder.clearCallingIdentity(); 1428713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato try { 1429b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids", 1430b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryExternalStatsWorker.UPDATE_ALL)); 1431713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato synchronized (mStats) { 1432713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return getHealthStatsForUidLocked(requestUid); 1433713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1434713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } catch (Exception ex) { 143582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex); 1436713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato throw ex; 1437713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } finally { 1438713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Binder.restoreCallingIdentity(ident); 1439713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1440713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1441713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1442713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1443713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a snapshot of the system health for a number of uids. 1444713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1445713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato @Override 1446713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) { 1447713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (!onlyCaller(requestUids)) { 1448713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato mContext.enforceCallingOrSelfPermission( 1449713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato android.Manifest.permission.BATTERY_STATS, null); 1450713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1451713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato long ident = Binder.clearCallingIdentity(); 1452713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato int i=-1; 1453713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato try { 1454b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids", 1455b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryExternalStatsWorker.UPDATE_ALL)); 1456713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato synchronized (mStats) { 1457713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int N = requestUids.length; 1458713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsParceler[] results = new HealthStatsParceler[N]; 1459713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato for (i=0; i<N; i++) { 1460713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato results[i] = getHealthStatsForUidLocked(requestUids[i]); 1461713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1462713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return results; 1463713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1464713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } catch (Exception ex) { 146582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots(" 1466713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato + Arrays.toString(requestUids) + ") i=" + i, ex); 1467713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato throw ex; 1468713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } finally { 1469713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Binder.restoreCallingIdentity(ident); 1470713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1471713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1472713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1473713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1474713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Returns whether the Binder.getCallingUid is the only thing in requestUids. 1475713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1476713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato private static boolean onlyCaller(int[] requestUids) { 1477713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int caller = Binder.getCallingUid(); 1478713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int N = requestUids.length; 1479713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato for (int i=0; i<N; i++) { 1480713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (requestUids[i] != caller) { 1481713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return false; 1482713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1483713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1484713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return true; 1485713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1486713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1487713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1488713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a HealthStatsParceler for the given uid. You should probably call 1489010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * updateExternalStatsSync first. 1490713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1491713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato HealthStatsParceler getHealthStatsForUidLocked(int requestUid) { 1492713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter(); 1493713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS); 1494713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid); 1495713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (uid != null) { 1496713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato writer.writeUid(uidWriter, mStats, uid); 1497713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1498713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return new HealthStatsParceler(uidWriter); 1499713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1500713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1502