BatteryStatsService.java revision d54f9dd6251c7bd7033630b7afa770190d41c409
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006-2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage com.android.server.am; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 194b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.bluetooth.BluetoothActivityEnergyInfo; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Context; 21e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.content.pm.ApplicationInfo; 223abd75ba3a981850cac43a401d0014a836559cb0Kenny Rootimport android.content.pm.PackageManager; 234b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinskiimport android.net.wifi.WifiActivityEnergyInfo; 24455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport android.os.PowerSaveState; 2591268cf21eace600792d04db1ac62e9268f48002Dianne Hackbornimport android.os.BatteryStats; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Binder; 276f357d3284a833cc50a990e14b39f389b8972254Jeff Brownimport android.os.Handler; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.IBinder; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Parcel; 300068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport android.os.ParcelFileDescriptor; 319ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinskiimport android.os.ParcelFormatException; 32cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport android.os.PowerManagerInternal; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Process; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.ServiceManager; 35e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackbornimport android.os.SystemClock; 36cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackbornimport android.os.UserHandle; 37e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shuklaimport android.os.UserManagerInternal; 387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 39713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsParceler; 40713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.HealthStatsWriter; 41713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport android.os.health.UidHealthStats; 4206f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinskiimport android.telephony.DataConnectionRealTimeInfo; 4321f76aa77075be5e057c36040d7d6e695c669b72Adam Lesinskiimport android.telephony.ModemActivityInfo; 44e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Savilleimport android.telephony.SignalStrength; 45e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport android.telephony.TelephonyManager; 468a9b22056b13477f59df934928c00c58b5871c95Joe Onoratoimport android.util.Slog; 47674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani 4832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.app.IBatteryStats; 49d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackbornimport com.android.internal.os.BatteryStatsHelper; 5032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasaniimport com.android.internal.os.BatteryStatsImpl; 51e43530ab571e901f94361078c7c1f970a0bd27f2Amith Yamasaniimport com.android.internal.os.PowerProfile; 5250df711a5125460acb8d2960ffc0a1f17a818103Bookatzimport com.android.internal.os.RpmStats; 53fe9a53bc45fd0124a876dc0a49680aaf86641d3eJeff Sharkeyimport com.android.internal.util.DumpUtils; 54cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornimport com.android.server.LocalServices; 55455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyuleiimport com.android.server.power.BatterySaverPolicy.ServiceType; 567ca2e823fa3a0b6953e48d32caeacfd687ad82dfChenjie Yuimport android.util.StatsLog; 5732dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.File; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.FileDescriptor; 600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackbornimport java.io.IOException; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.PrintWriter; 62515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.ByteBuffer; 63515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.CharBuffer; 64515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CharsetDecoder; 65515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.CodingErrorAction; 66515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinskiimport java.nio.charset.StandardCharsets; 67713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onoratoimport java.util.Arrays; 68e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackbornimport java.util.List; 69b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.ExecutionException; 70b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinskiimport java.util.concurrent.Future; 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * All information we are collecting about things that can happen that impact 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * battery life. 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 76cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackbornpublic final class BatteryStatsService extends IBatteryStats.Stub 7768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan implements PowerManagerInternal.LowPowerModeListener, 7868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan BatteryStatsImpl.PlatformIdleStateCallback { 79c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn static final String TAG = "BatteryStatsService"; 8082ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato static final boolean DBG = false; 81c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 82010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski private static IBatteryStats sService; 83010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final BatteryStatsImpl mStats; 85e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider; 86b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski private final Context mContext; 87b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski private final BatteryExternalStatsWorker mWorker; 884b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 8950df711a5125460acb8d2960ffc0a1f17a818103Bookatz private native void getLowPowerStats(RpmStats rpmStats); 9068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private native int getPlatformLowPowerStats(ByteBuffer outBuffer); 91d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy private native int getSubsystemLowPowerStats(ByteBuffer outBuffer); 9268cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private CharsetDecoder mDecoderStat = StandardCharsets.UTF_8 9368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .newDecoder() 9468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .onMalformedInput(CodingErrorAction.REPLACE) 9568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .onUnmappableCharacter(CodingErrorAction.REPLACE) 9668cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan .replaceWith("?"); 9768cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private ByteBuffer mUtf8BufferStat = ByteBuffer.allocateDirect(MAX_LOW_POWER_STATS_SIZE); 9868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private CharBuffer mUtf16BufferStat = CharBuffer.allocate(MAX_LOW_POWER_STATS_SIZE); 9968cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan private static final int MAX_LOW_POWER_STATS_SIZE = 512; 10068cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 10150df711a5125460acb8d2960ffc0a1f17a818103Bookatz /** 10250df711a5125460acb8d2960ffc0a1f17a818103Bookatz * Replaces the information in the given rpmStats with up-to-date information. 10350df711a5125460acb8d2960ffc0a1f17a818103Bookatz */ 10450df711a5125460acb8d2960ffc0a1f17a818103Bookatz @Override 10550df711a5125460acb8d2960ffc0a1f17a818103Bookatz public void fillLowPowerStats(RpmStats rpmStats) { 10650df711a5125460acb8d2960ffc0a1f17a818103Bookatz if (DBG) Slog.d(TAG, "begin getLowPowerStats"); 10750df711a5125460acb8d2960ffc0a1f17a818103Bookatz try { 10850df711a5125460acb8d2960ffc0a1f17a818103Bookatz getLowPowerStats(rpmStats); 10950df711a5125460acb8d2960ffc0a1f17a818103Bookatz } finally { 11050df711a5125460acb8d2960ffc0a1f17a818103Bookatz if (DBG) Slog.d(TAG, "end getLowPowerStats"); 11150df711a5125460acb8d2960ffc0a1f17a818103Bookatz } 11250df711a5125460acb8d2960ffc0a1f17a818103Bookatz } 11350df711a5125460acb8d2960ffc0a1f17a818103Bookatz 11468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan @Override 11568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan public String getPlatformLowPowerStats() { 11682ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats"); 117cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski try { 118cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf8BufferStat.clear(); 119cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf16BufferStat.clear(); 120cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mDecoderStat.reset(); 121cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski int bytesWritten = getPlatformLowPowerStats(mUtf8BufferStat); 122cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski if (bytesWritten < 0) { 123cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return null; 124cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } else if (bytesWritten == 0) { 125cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return "Empty"; 126cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } 127cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf8BufferStat.limit(bytesWritten); 128cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true); 129cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski mUtf16BufferStat.flip(); 130cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski return mUtf16BufferStat.toString(); 131cd722084fb8c127e1798948fdad79b53a37a239cAdam Lesinski } finally { 13282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats"); 13368cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } 13468cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan } 13568cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 136d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy @Override 137d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy public String getSubsystemLowPowerStats() { 13850df711a5125460acb8d2960ffc0a1f17a818103Bookatz if (DBG) Slog.d(TAG, "begin getSubsystemLowPowerStats"); 139d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy try { 140d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mUtf8BufferStat.clear(); 141d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mUtf16BufferStat.clear(); 142d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mDecoderStat.reset(); 143d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy int bytesWritten = getSubsystemLowPowerStats(mUtf8BufferStat); 144d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy if (bytesWritten < 0) { 145d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy return null; 146d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } else if (bytesWritten == 0) { 147d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy return "Empty"; 148d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } 149d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mUtf8BufferStat.limit(bytesWritten); 150d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mDecoderStat.decode(mUtf8BufferStat, mUtf16BufferStat, true); 151d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy mUtf16BufferStat.flip(); 152d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy return mUtf16BufferStat.toString(); 153d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } finally { 15450df711a5125460acb8d2960ffc0a1f17a818103Bookatz if (DBG) Slog.d(TAG, "end getSubsystemLowPowerStats"); 155d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } 156d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy } 157d8b441150ef35c1518203a465c0b622d23d60cbdAhmed ElArabawy 158b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryStatsService(Context context, File systemDir, Handler handler) { 1594b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski // BatteryStatsImpl expects the ActivityManagerService handler, so pass that one through. 160b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mContext = context; 161e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla mUserManagerUserInfoProvider = new BatteryStatsImpl.UserInfoProvider() { 162e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla private UserManagerInternal umi; 163e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla @Override 164e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla public int[] getUserIds() { 165e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla if (umi == null) { 166e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla umi = LocalServices.getService(UserManagerInternal.class); 167e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 168e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla return (umi != null) ? umi.getUserIds() : null; 169e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 170e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla }; 171e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla mStats = new BatteryStatsImpl(systemDir, handler, this, mUserManagerUserInfoProvider); 172b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker = new BatteryExternalStatsWorker(context, mStats); 173b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.setExternalStatsSyncLocked(mWorker); 174b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger( 175b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski com.android.internal.R.integer.config_radioScanningTimeout) * 1000L); 176b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.setPowerProfileLocked(new PowerProfile(context)); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17868cdf1997f7b007e4c81089bc402a0356292f4c2Badhri Jagan Sridharan 179b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski public void publish() { 1806832f39416cbe2cc9655af4eabefe39c5d272254Adam Lesinski ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder()); 1812c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 1822c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 183b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski private static void awaitUninterruptibly(Future<?> future) { 184b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski while (true) { 185b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski try { 186b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski future.get(); 187b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski return; 188b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } catch (ExecutionException e) { 189b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski return; 190b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } catch (InterruptedException e) { 191b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // Keep looping 192b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } 193b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } 194b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } 195b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski 1962c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown /** 1972c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * At the time when the constructor runs, the power manager has not yet been 1982c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown * initialized. So we initialize the low power observer later. 1992c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown */ 2002c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown public void initPowerManagement() { 201010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class); 202010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski powerMgr.registerLowPowerModeObserver(this); 20314ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski synchronized (mStats) { 20414ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski mStats.notePowerSaveModeLocked( 20514ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski powerMgr.getLowPowerState(ServiceType.BATTERY_STATS) 20614ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski .batterySaverEnabled); 20714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski } 208c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn (new WakeupReasonThread()).start(); 2092c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown } 2102c43c339de5aaf4fef58aa9b5ac3af48609263a8Jeff Brown 21155280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn public void shutdown() { 2128a9b22056b13477f59df934928c00c58b5871c95Joe Onorato Slog.w("BatteryStats", "Writing battery stats before shutdown..."); 2134b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 214b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("shutdown", BatteryExternalStatsWorker.UPDATE_ALL)); 215b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski 21655280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn synchronized (mStats) { 2176b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.shutdownLocked(); 21855280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 21920b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski 22020b84dfa59190bfef04aac6dc8fb90c9bac5f21bAdam Lesinski // Shutdown the thread we made. 221b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.shutdown(); 22255280a91884b9256e8db6af6a09f28b3feeaa9d8Dianne Hackborn } 2232f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static IBatteryStats getService() { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sService != null) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22891268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn IBinder b = ServiceManager.getService(BatteryStats.SERVICE_NAME); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sService = asInterface(b); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sService; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 232cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 233cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn @Override 234455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public int getServiceType() { 235455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei return ServiceType.BATTERY_STATS; 236455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei } 237455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei 238455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei @Override 239455e90add22835d0744fc0f5c2feb5fcaf03b28fjackqdyulei public void onLowPowerModeChanged(PowerSaveState result) { 240cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 24114ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski mStats.notePowerSaveModeLocked(result.batterySaverEnabled); 242cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 243cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 244cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the current statistics object, which may be modified 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to reflect events that affect battery usage. You must lock the 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * stats object before doing anything with it. 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BatteryStatsImpl getActiveStatistics() { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 2544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski /** 2554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * Schedules a write to disk to occur. This will cause the BatteryStatsImpl 2564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski * object to update with the latest info, then write to disk. 2574b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski */ 2584b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void scheduleWriteToDisk() { 259b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleWrite(); 2604b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 2614b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 2622f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // These are for direct use by the activity manager... 2632f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 264b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski /** 265b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski * Remove a UID from the BatteryStats and BatteryStats' external dependencies. 266b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski */ 267b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski void removeUid(int uid) { 268b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski synchronized (mStats) { 269b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski mStats.removeUidStatsLocked(uid); 270b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 271b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski } 272b83ffee5a40bf00e156152ad85bf8cf6bb96e2f1Adam Lesinski 273e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla void onCleanupUser(int userId) { 274e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla synchronized (mStats) { 275e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla mStats.onCleanupUserLocked(userId); 276e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 277e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 278e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla 279e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla void onUserRemoved(int userId) { 280e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla synchronized (mStats) { 281e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla mStats.onUserRemovedLocked(userId); 282e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 283e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla } 284e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla 2852f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void addIsolatedUid(int isolatedUid, int appUid) { 2862f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 2872f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.addIsolatedUidLocked(isolatedUid, appUid); 2882f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2892f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2902f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2912f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void removeIsolatedUid(int isolatedUid, int appUid) { 2922f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 29361db88fc8b4a5729d9ce6bc1b7bfaac5c09c8f90Adam Lesinski mStats.scheduleRemoveIsolatedUidLocked(isolatedUid, appUid); 2942f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2952f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 2962f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 2972f1993ec460166413e7887f151630f6708077c0fDianne Hackborn void noteProcessStart(String name, int uid) { 2982f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 2992f1993ec460166413e7887f151630f6708077c0fDianne Hackborn mStats.noteProcessStartLocked(name, uid); 3002f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3012f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3022f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3031e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessCrash(String name, int uid) { 3041e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 3051e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessCrashLocked(name, uid); 3061e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3071e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3081e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 3091e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn void noteProcessAnr(String name, int uid) { 3101e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 3111e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteProcessAnrLocked(name, uid); 3121e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3131e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 3141e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 315a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteProcessFinish(String name, int uid) { 3162f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 317a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteProcessFinishLocked(name, uid); 3182f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3192f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3202f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 321a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn void noteUidProcessState(int uid, int state) { 3222f1993ec460166413e7887f151630f6708077c0fDianne Hackborn synchronized (mStats) { 323d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen // TODO: remove this once we figure out properly where and how 324d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen StatsLog.write(StatsLog.PROCESS_STATE_CHANGED, uid, state); 325d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen 326a8d10945a608ac6f85a6ab85b69b9a118d7853d8Dianne Hackborn mStats.noteUidProcessStateLocked(uid, state); 3272f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3282f1993ec460166413e7887f151630f6708077c0fDianne Hackborn } 3292f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3302f1993ec460166413e7887f151630f6708077c0fDianne Hackborn // Public interface... 3312f1993ec460166413e7887f151630f6708077c0fDianne Hackborn 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public byte[] getStatistics() { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingPermission( 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 3358a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //Slog.i("foo", "SENDING BATTERY INFO:"); 3368a9b22056b13477f59df934928c00c58b5871c95Joe Onorato //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel out = Parcel.obtain(); 338b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL)); 3394b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 3404b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3414b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] data = out.marshall(); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project out.recycle(); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn public ParcelFileDescriptor getStatisticsStream() { 3480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mContext.enforceCallingPermission( 3490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn android.Manifest.permission.BATTERY_STATS, null); 3500068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //Slog.i("foo", "SENDING BATTERY INFO:"); 3510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn //mStats.dumpLocked(new LogPrinter(Log.INFO, "foo", Log.LOG_ID_SYSTEM)); 3520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel out = Parcel.obtain(); 353b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("get-stats", BatteryExternalStatsWorker.UPDATE_ALL)); 3544b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski synchronized (mStats) { 3554b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.writeToParcel(out, 0); 3564b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski } 3570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] data = out.marshall(); 3580068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn out.recycle(); 3590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 3600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return ParcelFileDescriptor.fromData(data, "battery-stats"); 3610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } catch (IOException e) { 3620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Unable to create shared memory", e); 3630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return null; 3640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3650068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 3660068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn 3674870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn public boolean isCharging() { 3684870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn synchronized (mStats) { 3694870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn return mStats.isCharging(); 3704870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3714870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn } 3724870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn 373ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeBatteryTimeRemaining() { 374ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 375ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeBatteryTimeRemaining(SystemClock.elapsedRealtime()); 376ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 377ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 378ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 379ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 380ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn public long computeChargeTimeRemaining() { 381ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn synchronized (mStats) { 382ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn long time = mStats.computeChargeTimeRemaining(SystemClock.elapsedRealtime()); 383ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn return time >= 0 ? (time/1000) : time; 384ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 385ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn } 386ab5c0ea43cf457b20ab4267a14b224f39e0511bfDianne Hackborn 387099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn public void noteEvent(int code, String name, int uid) { 388099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn enforceCallingPermission(); 389099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn synchronized (mStats) { 390099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn mStats.noteEventLocked(code, name, uid); 391099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 392099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } 393099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn 394fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncStart(String name, int uid) { 395fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 396fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 397fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncStartLocked(name, uid); 398fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 399fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 400fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 401fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteSyncFinish(String name, int uid) { 402fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 403fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 404fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteSyncFinishLocked(name, uid); 405fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 406fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 407fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 408fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn public void noteJobStart(String name, int uid) { 409fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 410fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 411fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn mStats.noteJobStartLocked(name, uid); 412fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 413fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 414fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 41594326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn public void noteJobFinish(String name, int uid, int stopReason) { 416fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn enforceCallingPermission(); 417fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn synchronized (mStats) { 41894326cb56aa0c7cee110d6781fb8b8f16fb09663Dianne Hackborn mStats.noteJobFinishLocked(name, uid, stopReason); 419fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 420fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn } 421fdb1956ff71ff57fcdaafaaeb7f42c19de3d7c2fDianne Hackborn 4221e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmStart(String name, int uid) { 4231e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 4241e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 4251e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmStartLocked(name, uid); 4261e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4271e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4281e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 4291e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn public void noteAlarmFinish(String name, int uid) { 4301e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn enforceCallingPermission(); 4311e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn synchronized (mStats) { 4321e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn mStats.noteAlarmFinishLocked(name, uid); 4331e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4341e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn } 4351e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn 436a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelock(int uid, int pid, String name, String historyName, int type, 4373d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn boolean unimportantForLogging) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 440e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn mStats.noteStartWakeLocked(uid, pid, name, historyName, type, unimportantForLogging, 44140c8725804f46c9d53f2815e0ee69e6cfb0152ccDianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 445cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelock(int uid, int pid, String name, String historyName, int type) { 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 448cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeLocked(uid, pid, name, historyName, type, 449cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 453a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn public void noteStartWakelockFromSource(WorkSource ws, int pid, String name, 454a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn String historyName, int type, boolean unimportantForLogging) { 4557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 457a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn mStats.noteStartWakeFromSourceLocked(ws, pid, name, historyName, 458a1f1a3c573acd91024fda0ceb3b921c73b186963Dianne Hackborn type, unimportantForLogging); 4597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4607e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4617e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 462cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteChangeWakelockFromSource(WorkSource ws, int pid, String name, 463cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn String historyName, int type, WorkSource newWs, int newPid, String newName, 464e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn String newHistoryName, int newType, boolean newUnimportantForLogging) { 465e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn enforceCallingPermission(); 466e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn synchronized (mStats) { 467cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteChangeWakelockFromSourceLocked(ws, pid, name, historyName, type, 468e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn newWs, newPid, newName, newHistoryName, newType, newUnimportantForLogging); 469e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 470e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn } 471e5167ca61e2c5607aad9041b44158581bc61b4d8Dianne Hackborn 472cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn public void noteStopWakelockFromSource(WorkSource ws, int pid, String name, String historyName, 473cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn int type) { 4747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 4757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 476cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn mStats.noteStopWakeFromSourceLocked(ws, pid, name, historyName, type); 4777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 4797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 480d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn public void noteLongPartialWakelockStart(String name, String historyName, int uid) { 481d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn enforceCallingPermission(); 482d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn synchronized (mStats) { 483d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn mStats.noteLongPartialWakelockStart(name, historyName, uid); 484d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 485d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 486d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn 487d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn public void noteLongPartialWakelockFinish(String name, String historyName, int uid) { 488d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn enforceCallingPermission(); 489d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn synchronized (mStats) { 490d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn mStats.noteLongPartialWakelockFinish(name, historyName, uid); 491d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 492d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn } 493d0db6f00435b83c88f041ccf0cfcb9986ae8e6efDianne Hackborn 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartSensor(int uid, int sensor) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 4979adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStartSensorLocked(uid, sensor); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50029fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopSensor(int uid, int sensor) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5049adb9c3b10991ef315c270993f4155709c8a232dDianne Hackborn mStats.noteStopSensorLocked(uid, sensor); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 50729fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 508a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOn(int uid, long durationMillis) { 509a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 510a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 511a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOnLocked(uid, durationMillis); 512a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 513a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 514a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 515a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void noteVibratorOff(int uid) { 516a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn enforceCallingPermission(); 517a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn synchronized (mStats) { 518a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mStats.noteVibratorOffLocked(uid); 519a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 520a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 521a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStartGps(int uid) { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5256b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStartGpsLocked(uid); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 52829fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void noteStopGps(int uid) { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5326b7b4845212b3a439c527f2e1eca205b6b45fcebDianne Hackborn mStats.noteStopGpsLocked(uid); 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 53529fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 536e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteScreenState(int state) { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 53882ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin noteScreenState"); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 540931945399859ab91545ba2c2a914f044092d5e2eJoe Onorato // TODO: remove this once we figure out properly where and how 541d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen StatsLog.write(StatsLog.SCREEN_STATE_CHANGED, state); 542d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen 543d54f9dd6251c7bd7033630b7afa770190d41c409Yao Chen mStats.noteScreenStateLocked(state); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end noteScreenState"); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 54729fb1f7bed46c7ec6a9465827302a6438da2dfa6Chenjie Yu 548617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn public void noteScreenBrightness(int brightness) { 549617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 550617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 551617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn mStats.noteScreenBrightnessLocked(brightness); 552617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 553617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 554e03583e261227d76ec4dec3d4e9dc9488a0623ccyro 555e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteUserActivity(int uid, int event) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 558e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteUserActivityLocked(uid, event); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 561e03583e261227d76ec4dec3d4e9dc9488a0623ccyro 562280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn public void noteWakeUp(String reason, int reasonUid) { 563280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn enforceCallingPermission(); 564280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn synchronized (mStats) { 565280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn mStats.noteWakeUpLocked(reason, reasonUid); 566280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 567280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn } 568280a64e793d081847c5dcea23ed9be38aa5332d2Dianne Hackborn 569e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown public void noteInteractive(boolean interactive) { 570617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn enforceCallingPermission(); 571617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn synchronized (mStats) { 572e95c3cd89591ba586aa8a0f7a17660c6fb8770bcJeff Brown mStats.noteInteractiveLocked(interactive); 573617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 574617f877c06c82584a38f41bb60d836e08c5e3bdaDianne Hackborn } 575e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 5761e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn public void noteConnectivityChanged(int type, String extra) { 5771e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn enforceCallingPermission(); 5781e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn synchronized (mStats) { 5791e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn mStats.noteConnectivityChangedLocked(type, extra); 5801e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 5811e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn } 5821e01d16982e6b22ec4c0e2d6dc1e261eb6f92c8eDianne Hackborn 583fa97fcf7b9b9999102bc0c6b298114375b27a1c3Ruchi Kandoi public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) { 584e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn enforceCallingPermission(); 585b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski final boolean update; 586e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn synchronized (mStats) { 58714ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid); 58814ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski } 58914ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski 59014ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski if (update) { 591b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("modem-data", BatteryExternalStatsWorker.UPDATE_RADIO); 592e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 593e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn } 594e13c4c0b664dabdc069ca8f9601d96a337eb02f9Dianne Hackborn 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOn() { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOnLocked(); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6012f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void notePhoneOff() { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enforceCallingPermission(); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mStats) { 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mStats.notePhoneOffLocked(); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6082f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 609e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville public void notePhoneSignalStrength(SignalStrength signalStrength) { 610627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 611627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 612e9b06d754af03faf27012fbed1e7559ec1ba7c79Wink Saville mStats.notePhoneSignalStrengthLocked(signalStrength); 613627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 614627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 6152f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 616627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn public void notePhoneDataConnectionState(int dataType, boolean hasData) { 617627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn enforceCallingPermission(); 618627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn synchronized (mStats) { 619627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn mStats.notePhoneDataConnectionStateLocked(dataType, hasData); 620627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 621627bba736d022c39696b7c582a6af5592d2b8c33Dianne Hackborn } 62232dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 623f37447bad3773b62176baa837908daf6edb44273Amith Yamasani public void notePhoneState(int state) { 62432dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani enforceCallingPermission(); 625e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn int simState = TelephonyManager.getDefault().getSimState(); 62632dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani synchronized (mStats) { 627e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn mStats.notePhoneStateLocked(state, simState); 62832dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 62932dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani } 63032dbefda71c50bf848da21fb5d1255273439f90dAmith Yamasani 63158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOn() { 632105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 633105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 63458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOnLocked(); 635105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 636105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 6372f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 63858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiOff() { 639105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 640105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 64158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiOffLocked(); 642105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 643105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 644d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 645244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartAudio(int uid) { 646244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 647244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 648244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOnLocked(uid); 649244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 650244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 651244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 652244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopAudio(int uid) { 653244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 654244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 655244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteAudioOffLocked(uid); 656244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 657244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 658244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 659244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStartVideo(int uid) { 660244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 661244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 662244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOnLocked(uid); 663244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 664244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 665244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 666244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani public void noteStopVideo(int uid) { 667244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani enforceCallingPermission(); 668244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani synchronized (mStats) { 669244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani mStats.noteVideoOffLocked(uid); 670244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 671244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani } 672244fa5c05b2cc8c4c0754aeed4ee42c588ea89d1Amith Yamasani 67310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetAudio() { 67410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 67510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 67610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetAudioLocked(); 67710eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 67810eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 67910eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 68010eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn public void noteResetVideo() { 68110eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn enforceCallingPermission(); 68210eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn synchronized (mStats) { 68310eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn mStats.noteResetVideoLocked(); 68410eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 68510eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn } 68610eaa8574bb220e7dddf9a78057f83dc64ee5687Dianne Hackborn 6876d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOn(int uid) { 688abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 689abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 6906d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOnLocked(uid); 691abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 692abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 693abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 6946d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteFlashlightOff(int uid) { 695abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn enforceCallingPermission(); 696abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn synchronized (mStats) { 6976d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteFlashlightOffLocked(uid); 6986d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 6996d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7006d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7016d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStartCamera(int uid) { 7026d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 70382ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin noteStartCamera"); 7046d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7056d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOnLocked(uid); 7066d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 70782ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end noteStartCamera"); 7086d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7096d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7106d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteStopCamera(int uid) { 7116d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7126d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7136d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteCameraOffLocked(uid); 7146d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7156d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7166d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7176d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetCamera() { 7186d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7196d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7206d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetCameraLocked(); 7216d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7226d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk } 7236d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk 7246d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk public void noteResetFlashlight() { 7256d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk enforceCallingPermission(); 7266d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk synchronized (mStats) { 7276d2c363fd59af805380622ff7a3ce4c34975aab2Ruben Brunk mStats.noteResetFlashlightLocked(); 728abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 729abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn } 730abc7c499133fe640d6ece2b28d43b52e66cdaa9aDianne Hackborn 731e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski @Override 7325f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski public void noteWifiRadioPowerState(int powerState, long tsNanos, int uid) { 733e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski enforceCallingPermission(); 734e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 735e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // There was a change in WiFi power state. 736e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski // Collect data now for the past activity. 7370c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn synchronized (mStats) { 738a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski if (mStats.isOnBattery()) { 73906f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski final String type = (powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH || 74006f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active" 74106f46cb32067572f25721ebe62fefd29cc34c7f0Adam Lesinski : "inactive"; 742b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("wifi-data: " + type, BatteryExternalStatsWorker.UPDATE_WIFI); 743a7c90c84e46501b3afed221a448079d567ed853cAdam Lesinski } 7445f056f6d87b2b9f2abc1b37c5d8530d57c6230cdAdam Lesinski mStats.noteWifiRadioPowerState(powerState, tsNanos, uid); 7450c820db22c83808fdb06c7cb06aaf13ef4b559a3Dianne Hackborn } 746e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski } 747e08af19fcc7b13d526f3dfd24d58300947cf1146Adam Lesinski 74858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunning(WorkSource ws) { 749d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 750d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 75158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningLocked(ws); 752d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 753d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 754d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 75558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiRunningChanged(WorkSource oldWs, WorkSource newWs) { 756d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood enforceCallingPermission(); 757d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood synchronized (mStats) { 75858e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiRunningChangedLocked(oldWs, newWs); 75958e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 76058e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn } 76158e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn 76258e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn public void noteWifiStopped(WorkSource ws) { 76358e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn enforceCallingPermission(); 76458e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn synchronized (mStats) { 76558e0eefeb5e2e270e2b04369bbf29fc22abda8d5Dianne Hackborn mStats.noteWifiStoppedLocked(ws); 766d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 767d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood } 768d4c5f8919b0522bcaab41a5863c313fec52d3a79Eric Shienbrood 769ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn public void noteWifiState(int wifiState, String accessPoint) { 770ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn enforceCallingPermission(); 771ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn synchronized (mStats) { 772ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn mStats.noteWifiStateLocked(wifiState, accessPoint); 773ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 774ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn } 775ca1bf21c511dc7d513b631a1af8498b5b08d107aDianne Hackborn 7763251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiSupplicantStateChanged(int supplState, boolean failedAuth) { 7773251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 7783251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 7793251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiSupplicantStateChangedLocked(supplState, failedAuth); 7803251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7813251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7823251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 7833251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn public void noteWifiRssiChanged(int newRssi) { 7843251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn enforceCallingPermission(); 7853251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn synchronized (mStats) { 7863251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn mStats.noteWifiRssiChangedLocked(newRssi); 7873251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7883251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn } 7893251b9075246841a7b1ddecf10859b1abd858f33Dianne Hackborn 790105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockAcquired(int uid) { 791105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 792105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 793105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockAcquiredLocked(uid); 794105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 795105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 7962f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 797105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project public void noteFullWifiLockReleased(int uid) { 798105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 799105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 800105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project mStats.noteFullWifiLockReleasedLocked(uid); 801105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 802105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8036ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 8046ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStarted(int uid) { 805105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 806105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 8076ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedLocked(uid); 808105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 809105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8106ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly 8116ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStopped(int uid) { 812105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project enforceCallingPermission(); 813105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project synchronized (mStats) { 8146ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedLocked(uid); 815105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 816105925376f8d0f6b318c9938c7b83ef7fef094daThe Android Open Source Project } 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8185347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastEnabled(int uid) { 8195347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 8205347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 8215347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastEnabledLocked(uid); 8225347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8235347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8245347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8255347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt public void noteWifiMulticastDisabled(int uid) { 8265347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt enforceCallingPermission(); 8275347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt synchronized (mStats) { 8285347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt mStats.noteWifiMulticastDisabledLocked(uid); 8295347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8305347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt } 8315347bd4cda2b6afc18f8acab48e52131f35ed13cRobert Greenwalt 8327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockAcquiredFromSource(WorkSource ws) { 8337e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8357e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockAcquiredFromSourceLocked(ws); 8367e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8377e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8397e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteFullWifiLockReleasedFromSource(WorkSource ws) { 8407e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8417e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8427e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteFullWifiLockReleasedFromSourceLocked(ws); 8437e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8447e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8457e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8466ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStartedFromSource(WorkSource ws) { 8477e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8487e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8496ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStartedFromSourceLocked(ws); 8507e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8517e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8527e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8536ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly public void noteWifiScanStoppedFromSource(WorkSource ws) { 8547e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8557e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8566ccaa540a18a69e5343e3e4d507f341880fcde5aNick Pelly mStats.noteWifiScanStoppedFromSourceLocked(ws); 8577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8597e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 860a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStartedFromSource(WorkSource ws, int csph) { 861a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 862a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 863a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStartedFromSourceLocked(ws, csph); 864a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 865a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 866a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 867a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt public void noteWifiBatchedScanStoppedFromSource(WorkSource ws) { 868a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt enforceCallingPermission(); 869a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt synchronized (mStats) { 870a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt mStats.noteWifiBatchedScanStoppedFromSourceLocked(ws); 871a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 872a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt } 873a029ea131836725b050e1a7550aa171b68171522Robert Greenwalt 8747e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastEnabledFromSource(WorkSource ws) { 8757e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8767e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8777e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastEnabledFromSourceLocked(ws); 8787e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8797e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8807e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8814b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski @Override 8827e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void noteWifiMulticastDisabledFromSource(WorkSource ws) { 8837e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn enforceCallingPermission(); 8847e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn synchronized (mStats) { 8857e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mStats.noteWifiMulticastDisabledFromSourceLocked(ws); 8867e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8877e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn } 8887e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn 8897a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 8904b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski public void noteNetworkInterfaceType(String iface, int networkType) { 8911059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey enforceCallingPermission(); 8921059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey synchronized (mStats) { 8934b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski mStats.noteNetworkInterfaceTypeLocked(iface, networkType); 8941059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 8951059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey } 8961059c3c30ad96a15695c1a92ae8896e078a6309fJeff Sharkey 8977a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey @Override 8987a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey public void noteNetworkStatsEnabled() { 8997a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey enforceCallingPermission(); 900b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // During device boot, qtaguid isn't enabled until after the inital 901b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // loading of battery stats. Now that they're enabled, take our initial 902b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // snapshot for future delta calculation. 903b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("network-stats-enabled", 904b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryExternalStatsWorker.UPDATE_RADIO | BatteryExternalStatsWorker.UPDATE_WIFI); 9057a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey } 9067a1c3fce478122b9f03464117dc94d44f7c1995eJeff Sharkey 9078ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn @Override 90808c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn public void noteDeviceIdleMode(int mode, String activeReason, int activeUid) { 9098ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9108ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 91108c47a5dece977a55d250d98bda9e2a8df8b6ed0Dianne Hackborn mStats.noteDeviceIdleModeLocked(mode, activeReason, activeUid); 9128ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9138ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9148ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9158ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageInstalled(String pkgName, int versionCode) { 9168ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9178ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 9188ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageInstalledLocked(pkgName, versionCode); 9198ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9208ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9218ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9228ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn public void notePackageUninstalled(String pkgName) { 9238ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn enforceCallingPermission(); 9248ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn synchronized (mStats) { 9258ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn mStats.notePackageUninstalledLocked(pkgName); 9268ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9278ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn } 9288ad2af7e5b28f71e7bdfc1bb097937c6c1d22b18Dianne Hackborn 9296771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski @Override 930b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) { 9316771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski enforceCallingPermission(); 9329f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 933b1f04f372c42114e864d52f4206ff07d9264c5b9Bookatz mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized); 9349f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9356771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9366771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 9376771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski @Override 93894c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz public void noteBleScanStopped(WorkSource ws, boolean isUnoptimized) { 9396771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski enforceCallingPermission(); 9409f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 94194c5a313d7313a9a88abdf4267af43b87deb0dd2Bookatz mStats.noteBluetoothScanStoppedFromSourceLocked(ws, isUnoptimized); 9429f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9439f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 9449f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski 9459f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski @Override 9469f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski public void noteResetBleScan() { 9479f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski enforceCallingPermission(); 9489f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski synchronized (mStats) { 9499f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski mStats.noteResetBluetoothScanLocked(); 9509f55cc71b9b0a27604d448b5c54e3c377b7a067fAdam Lesinski } 951956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz } 952956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz 953956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz @Override 9544ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz public void noteBleScanResults(WorkSource ws, int numNewResults) { 955956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz enforceCallingPermission(); 956956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz synchronized (mStats) { 9574ebc064c30e5322e8f479f6732dfd44f72bfec77Bookatz mStats.noteBluetoothScanResultsFromSourceLocked(ws, numNewResults); 958956f36bfe2bcb16080336572e6042ae1ab66c5beBookatz } 9596771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski } 9606771d629b5ad0b9296f0febaa2300fdaf1f90515Adam Lesinski 961010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 962010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteWifiControllerActivity(WifiActivityEnergyInfo info) { 963010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 964010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 965010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 966010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid wifi data given: " + info); 967010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 968010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 969010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 97014ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski mStats.updateWifiState(info); 971010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 972010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 973010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 974010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteBluetoothControllerActivity(BluetoothActivityEnergyInfo info) { 975010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 976010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 977010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid bluetooth data given: " + info); 978010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 979010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 980010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 981b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.updateBluetoothStateLocked(info); 982010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 983010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 984010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski @Override 985010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski public void noteModemControllerActivity(ModemActivityInfo info) { 986010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski enforceCallingPermission(); 987010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 988010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski if (info == null || !info.isValid()) { 989010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski Slog.e(TAG, "invalid modem data given: " + info); 990010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski return; 991010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 992010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 99314ae39acbc1387a46946de88e068e10baa76f831Adam Lesinski mStats.updateMobileRadioState(info); 994010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski } 995010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isOnBattery() { 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.isOnBattery(); 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9994b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1000d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski @Override 1001d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski public void setBatteryState(final int status, final int health, final int plugType, 1002041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski final int level, final int temp, final int volt, final int chargeUAh, 1003041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski final int chargeFullUAh) { 1004d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski enforceCallingPermission(); 1005d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 1006d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // BatteryService calls us here and we may update external state. It would be wrong 1007d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski // to block such a low level service like BatteryService on external stats like WiFi. 1008b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleRunnable(() -> { 1009b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski synchronized (mStats) { 1010b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski final boolean onBattery = plugType == BatteryStatsImpl.BATTERY_PLUGGED_NONE; 1011b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski if (mStats.isOnBattery() == onBattery) { 1012b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // The battery state has not changed, so we don't need to sync external 1013b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // stats immediately. 1014b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt, 1015b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski chargeUAh, chargeFullUAh); 1016b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski return; 1017d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1018b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski } 1019d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski 1020b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // Sync external stats first as the battery has changed states. If we don't sync 1021b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // before changing the state, we may not collect the relevant data later. 1022b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // Order here is guaranteed since we're scheduling from the same thread and we are 1023b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski // using a single threaded executor. 1024b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("battery-state", BatteryExternalStatsWorker.UPDATE_ALL); 1025b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleRunnable(() -> { 1026d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski synchronized (mStats) { 1027926969b411ca52eeefd6b01c0c7970d8a65ee526Adam Lesinski mStats.setBatteryStateLocked(status, health, plugType, level, temp, volt, 1028041d917baaf62ca041638d775fc618ccd21f2d3aAdam Lesinski chargeUAh, chargeFullUAh); 1029d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski } 1030b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski }); 1031d7616ef73c48a1e5d6ba0e36fc6e85b007832d25Adam Lesinski }); 1032633a1740ce5951ccb5d478ba2795f6f4fada1646Evan Millar } 10332f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimeBattery() { 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimeBattery(); 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getAwakeTimePlugged() { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforceCallingOrSelfPermission( 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android.Manifest.permission.BATTERY_STATS, null); 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mStats.getAwakeTimePlugged(); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void enforceCallingPermission() { 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (Binder.getCallingPid() == Process.myPid()) { 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext.enforcePermission(android.Manifest.permission.UPDATE_DEVICE_STATS, 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Binder.getCallingPid(), Binder.getCallingUid(), null); 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1053c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1054c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn final class WakeupReasonThread extends Thread { 1055515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static final int MAX_REASON_SIZE = 512; 1056515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharsetDecoder mDecoder; 1057515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private ByteBuffer mUtf8Buffer; 1058515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private CharBuffer mUtf16Buffer; 1059c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1060c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn WakeupReasonThread() { 1061c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn super("BatteryStats_wakeupReason"); 1062c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1063c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1064c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn public void run() { 1065c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Process.setThreadPriority(Process.THREAD_PRIORITY_FOREGROUND); 1066c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1067515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder = StandardCharsets.UTF_8 1068515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .newDecoder() 1069515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onMalformedInput(CodingErrorAction.REPLACE) 1070515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .onUnmappableCharacter(CodingErrorAction.REPLACE) 1071515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski .replaceWith("?"); 1072515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1073515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer = ByteBuffer.allocateDirect(MAX_REASON_SIZE); 1074515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer = CharBuffer.allocate(MAX_REASON_SIZE); 1075515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1076c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn try { 1077515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski String reason; 1078515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski while ((reason = waitWakeup()) != null) { 1079c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn synchronized (mStats) { 1080515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mStats.noteWakeupReasonLocked(reason); 1081c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1082c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1083c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } catch (RuntimeException e) { 1084c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn Slog.e(TAG, "Failure reading wakeup reasons", e); 1085c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1086c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1087515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1088515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private String waitWakeup() { 1089515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.clear(); 1090515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.clear(); 1091515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.reset(); 1092515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1093515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski int bytesWritten = nativeWaitWakeup(mUtf8Buffer); 1094515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski if (bytesWritten < 0) { 1095515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return null; 1096515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } else if (bytesWritten == 0) { 1097515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return "unknown"; 1098515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1099515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1100515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Set the buffer's limit to the number of bytes written. 1101515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf8Buffer.limit(bytesWritten); 1102515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1103515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Decode the buffer from UTF-8 to UTF-16. 1104515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Unmappable characters will be replaced. 1105515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mDecoder.decode(mUtf8Buffer, mUtf16Buffer, true); 1106515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski mUtf16Buffer.flip(); 1107515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski 1108515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski // Create a String from the UTF-16 buffer. 1109515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski return mUtf16Buffer.toString(); 1110515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski } 1111c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1112c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1113515702c29e5eae0e3f02b5d65ed86218813e8945Adam Lesinski private static native int nativeWaitWakeup(ByteBuffer outBuffer); 1114c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn 1115ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn private void dumpHelp(PrintWriter pw) { 111691268cf21eace600792d04db1ac62e9268f48002Dianne Hackborn pw.println("Battery stats (batterystats) dump options:"); 11171e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn pw.println(" [--checkin] [--history] [--history-start] [--charged] [-c]"); 1118d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] [<package.name>]"); 1119865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" --checkin: generate output for a checkin report; will write (and clear) the"); 1120865b79b43b75361fceb3aa1c99ad6f6e7c90e6acDianne Hackborn pw.println(" last old completed stats when they had been reset."); 11211476d32b87d85885838fb066bcca48f1df9750b6Joe Onorato pw.println(" -c: write the current stats in checkin format."); 1122099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn pw.println(" --history: show only history data."); 1123c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --history-start <num>: show only history data starting at given time offset."); 1124c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println(" --charged: only output data since last charged."); 1125d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --daily: only output full daily data."); 1126ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --reset: reset the stats, clearing all current data."); 1127ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn pw.println(" --write: force write current collected stats to disk."); 1128d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --new-daily: immediately create and write new daily stats record."); 1129d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println(" --read-daily: read-load last written daily stats."); 1130cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println(" <package.name>: optional name of package to filter output by."); 1131fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" -h: print this help text."); 1132fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println("Battery stats (batterystats) commands:"); 1133fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" enable|disable <option>"); 1134fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Enable or disable a running option. Option state is not saved across boots."); 1135fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" Options are:"); 11360068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn pw.println(" full-history: include additional detailed events in battery history:"); 11371e38382b542f5cef9957a89692b02c55a3dd351cDianne Hackborn pw.println(" wake_lock_in, alarms and proc events"); 1138fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn pw.println(" no-auto-reset: don't automatically reset stats when unplugged"); 1139674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani pw.println(" pretend-screen-off: pretend the screen is off, even if screen state changes"); 1140ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } 1141ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn 1142cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn private int doEnableOrDisable(PrintWriter pw, int i, String[] args, boolean enable) { 1143cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i++; 1144cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i >= args.length) { 1145cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Missing option argument for " + (enable ? "--enable" : "--disable")); 1146cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1147cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1148cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 11490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if ("full-wake-history".equals(args[i]) || "full-history".equals(args[i])) { 1150cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn synchronized (mStats) { 11510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.setRecordAllHistoryLocked(enable); 1152cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 11539a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } else if ("no-auto-reset".equals(args[i])) { 11549a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn synchronized (mStats) { 11559a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn mStats.setNoAutoReset(enable); 11569a7554300637902bbb25991ffba41a9b8f682effDianne Hackborn } 1157674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani } else if ("pretend-screen-off".equals(args[i])) { 1158674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani synchronized (mStats) { 1159674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani mStats.setPretendScreenOff(enable); 1160674c9bb2ffde84bd177fd44568d9a12b1c16dc6fAmith Yamasani } 1161cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } else { 1162cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Unknown enable/disable option: " + args[i]); 1163cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn dumpHelp(pw); 1164cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return -1; 1165cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1166cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return i; 1167cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1168cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn 11694b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 11726df866a8510af2776c48425a361f708ae7f5d7d6Jeff Sharkey if (!DumpUtils.checkDumpAndUsageStatsPermission(mContext, TAG, pw)) return; 11733abd75ba3a981850cac43a401d0014a836559cb0Kenny Root 1174c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn int flags = 0; 11750068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean useCheckinFormat = false; 11762f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams boolean toProto = false; 11770068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn boolean isRealCheckin = false; 11780ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn boolean noOutput = false; 117916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn boolean writeData = false; 1180c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn long historyStart = -1; 1181cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn int reqUid = -1; 1182e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if (args != null) { 1183c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn for (int i=0; i<args.length; i++) { 1184c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn String arg = args[i]; 1185e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn if ("--checkin".equals(arg)) { 11860068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 11870068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn isRealCheckin = true; 1188099bc627c463d9941e23e480f25a78a154429c55Dianne Hackborn } else if ("--history".equals(arg)) { 1189c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1190c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--history-start".equals(arg)) { 1191c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_HISTORY_ONLY; 1192c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn i++; 1193c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn if (i >= args.length) { 1194c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn pw.println("Missing time argument for --history-since"); 1195c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn dumpHelp(pw); 1196c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn return; 1197c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } 1198c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn historyStart = Long.parseLong(args[i]); 119916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn writeData = true; 120049021f5f790c31f62d4cee9fafcae13505bed798Dianne Hackborn } else if ("-c".equals(arg)) { 12010068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn useCheckinFormat = true; 1202c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_INCLUDE_HISTORY; 12032f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } else if ("--proto".equals(arg)) { 12042f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams toProto = true; 1205c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn } else if ("--charged".equals(arg)) { 1206c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1207d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--daily".equals(arg)) { 1208d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn flags |= BatteryStats.DUMP_DAILY_ONLY; 1209e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else if ("--reset".equals(arg)) { 1210e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 12113d658bf20e2d56e36941e7407deebeec1276fbcfDianne Hackborn mStats.resetAllStatsCmdLocked(); 1212e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pw.println("Battery stats reset."); 12130ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1215b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL); 12160ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } else if ("--write".equals(arg)) { 1217b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("dump", 1218b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryExternalStatsWorker.UPDATE_ALL)); 12190ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn synchronized (mStats) { 12200ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn mStats.writeSyncLocked(); 12210ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Battery stats written."); 12220ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn noOutput = true; 12230ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 1224d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--new-daily".equals(arg)) { 1225d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1226d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.recordDailyStatsLocked(); 1227d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("New daily stats written."); 1228d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1229d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1230d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } else if ("--read-daily".equals(arg)) { 1231d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn synchronized (mStats) { 1232d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn mStats.readDailyStatsLocked(); 1233d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn pw.println("Last daily stats read."); 1234d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn noOutput = true; 1235d4a8af7b6a4dd663cb9c4d993ee41ca82af3c4cdDianne Hackborn } 1236fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--enable".equals(arg) || "enable".equals(arg)) { 1237cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, true); 1238cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1239cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1240cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1241cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Enabled: " + args[i]); 1242cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1243fc0641340ff927d9c35d5613723d25858f751118Dianne Hackborn } else if ("--disable".equals(arg) || "disable".equals(arg)) { 1244cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn i = doEnableOrDisable(pw, i, args, false); 1245cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn if (i < 0) { 1246cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1247cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn } 1248cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn pw.println("Disabled: " + args[i]); 1249cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn return; 1250ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn } else if ("-h".equals(arg)) { 1251ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1252ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn return; 1253e81740442f94aefe7dd3f061dfbd20a6fdeb667dMike Lockwood } else if ("-a".equals(arg)) { 1254a1bd79268be693f04f4adee90673d6ed400cc9fdDianne Hackborn flags |= BatteryStats.DUMP_VERBOSE; 1255cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else if (arg.length() > 0 && arg.charAt(0) == '-'){ 12560ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn pw.println("Unknown option: " + arg); 1257ae3844527a305cef8bbd1c895b79be45a6c51dbcDianne Hackborn dumpHelp(pw); 1258cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1259cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } else { 1260cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn // Not an option, last argument must be a package name. 1261cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn try { 1262e06b4d1d9f718b9fe02980fea794a36831a16db2Jeff Sharkey reqUid = mContext.getPackageManager().getPackageUidAsUser(arg, 1263cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn UserHandle.getCallingUserId()); 1264cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 1265cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn pw.println("Unknown package: " + arg); 1266cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn dumpHelp(pw); 1267cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn return; 1268cbfd23ee6f14445c3e17c5169abbc80c216fa137Dianne Hackborn } 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1271e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 12720ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn if (noOutput) { 12730ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn return; 12740ffc988a7f47013805d5abeed1c20f159b3bd799Dianne Hackborn } 127513a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 127613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn long ident = Binder.clearCallingIdentity(); 127713a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn try { 127813a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn if (BatteryStatsHelper.checkWifiOnly(mContext)) { 127913a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn flags |= BatteryStats.DUMP_DEVICE_WIFI_ONLY; 128013a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } 128113a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn // Fetch data from external sources and update the BatteryStatsImpl object with them. 1282b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("dump", BatteryExternalStatsWorker.UPDATE_ALL)); 128313a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn } finally { 128413a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn Binder.restoreCallingIdentity(ident); 1285d953c53d3b04d772bb1b62ede1c2011641ca82b5Dianne Hackborn } 128613a6a9b39ed99fa38e452dd0aacfe1897f32d84aDianne Hackborn 1287ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn if (reqUid >= 0) { 1288ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // By default, if the caller is only interested in a specific package, then 1289ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // we only dump the aggregated data since charged. 12901e725a7ec9eb79bb447d5171839c453d672a895cDianne Hackborn if ((flags&(BatteryStats.DUMP_HISTORY_ONLY|BatteryStats.DUMP_CHARGED_ONLY)) == 0) { 1291ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags |= BatteryStats.DUMP_CHARGED_ONLY; 1292ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn // Also if they are doing -c, we don't want history. 1293ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn flags &= ~BatteryStats.DUMP_INCLUDE_HISTORY; 1294ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 1295ab4a81b3c625e33d04ae8070fcce6b6baee6522cDianne Hackborn } 12964b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 12972f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (toProto) { 12982f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications( 12992f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL); 13002f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (isRealCheckin) { 13012f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams // For a real checkin, first we want to prefer to use the last complete checkin 13022f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams // file if there is one. 13032f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams synchronized (mStats.mCheckinFile) { 13042f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (mStats.mCheckinFile.exists()) { 13052f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams try { 13062f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams byte[] raw = mStats.mCheckinFile.readFully(); 13072f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (raw != null) { 13082f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams Parcel in = Parcel.obtain(); 13092f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams in.unmarshall(raw, 0, raw.length); 13102f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams in.setDataPosition(0); 13112f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams BatteryStatsImpl checkinStats = new BatteryStatsImpl( 13122f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams null, mStats.mHandler, null, mUserManagerUserInfoProvider); 13132f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams checkinStats.readSummaryFromParcel(in); 13142f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams in.recycle(); 13152f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams checkinStats.dumpProtoLocked(mContext, fd, apps, flags, 13162f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams historyStart); 13172f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams mStats.mCheckinFile.delete(); 13182f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams return; 13192f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13202f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } catch (IOException | ParcelFormatException e) { 13212f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams Slog.w(TAG, "Failure reading checkin file " 13222f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams + mStats.mCheckinFile.getBaseFile(), e); 13232f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13242f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13252f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13262f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13272f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (DBG) Slog.d(TAG, "begin dumpProtoLocked from UID " + Binder.getCallingUid()); 13282f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams synchronized (mStats) { 13292f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams mStats.dumpProtoLocked(mContext, fd, apps, flags, historyStart); 13302f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (writeData) { 13312f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams mStats.writeAsyncLocked(); 13322f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13332f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } 13342f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams if (DBG) Slog.d(TAG, "end dumpProtoLocked"); 13352f73ecdf527e46f22031934ce26315c5147bb9b0Kweku Adams } else if (useCheckinFormat) { 13369cfba3502079f5919ec065da2f8d86fe35c475daDianne Hackborn List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications( 13370d1fd8d09163566d2c7eb72037f63b6404ada642Amith Yamasani PackageManager.MATCH_ANY_USER | PackageManager.MATCH_ALL); 13380068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (isRealCheckin) { 13390068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // For a real checkin, first we want to prefer to use the last complete checkin 13400068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn // file if there is one. 13410068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn synchronized (mStats.mCheckinFile) { 13420068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (mStats.mCheckinFile.exists()) { 13430068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn try { 13440068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn byte[] raw = mStats.mCheckinFile.readFully(); 13450068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn if (raw != null) { 13460068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Parcel in = Parcel.obtain(); 13470068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.unmarshall(raw, 0, raw.length); 13480068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.setDataPosition(0); 13490068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn BatteryStatsImpl checkinStats = new BatteryStatsImpl( 1350e6e723d588bf7ebd7ec28d97c31ee44b5b4e0b54Suprabh Shukla null, mStats.mHandler, null, mUserManagerUserInfoProvider); 13510068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.readSummaryFromParcel(in); 13520068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn in.recycle(); 13530068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn checkinStats.dumpCheckinLocked(mContext, pw, apps, flags, 13540068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn historyStart); 13550068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn mStats.mCheckinFile.delete(); 13560068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn return; 13570068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13589ae9cba0209a8baf0a5d7463dc1c9a4831c916f6Adam Lesinski } catch (IOException | ParcelFormatException e) { 13590068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn Slog.w(TAG, "Failure reading checkin file " 13600068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn + mStats.mCheckinFile.getBaseFile(), e); 13610068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13620068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13630068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 13640068d3dcf1f1a804554a1a09e3b173ac12651786Dianne Hackborn } 136582ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid()); 1366e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1367c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart); 136816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 136916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 137016b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1371e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 137282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end dumpCheckinLocked"); 1373e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } else { 137482ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid()); 1375e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn synchronized (mStats) { 1376c51cf03cf2458c8c137f60c7379f2cccf681d16fDianne Hackborn mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart); 137716b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn if (writeData) { 137816b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn mStats.writeAsyncLocked(); 137916b0b56c79ee0bd068ce47ce4460c24b5e62311dDianne Hackborn } 1380e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn } 138182ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "end dumpLocked"); 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13844b6bd8d36b093d36d9ae80b43e95049c259d7319Adam Lesinski 1385713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1386713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a snapshot of the system health for a particular uid. 1387713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1388713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato @Override 1389713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato public HealthStatsParceler takeUidSnapshot(int requestUid) { 1390713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (requestUid != Binder.getCallingUid()) { 1391713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato mContext.enforceCallingOrSelfPermission( 1392713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato android.Manifest.permission.BATTERY_STATS, null); 1393713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1394713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato long ident = Binder.clearCallingIdentity(); 1395713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato try { 1396b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids", 1397b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryExternalStatsWorker.UPDATE_ALL)); 1398713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato synchronized (mStats) { 1399713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return getHealthStatsForUidLocked(requestUid); 1400713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1401713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } catch (Exception ex) { 140282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex); 1403713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato throw ex; 1404713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } finally { 1405713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Binder.restoreCallingIdentity(ident); 1406713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1407713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1408713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1409713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1410713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a snapshot of the system health for a number of uids. 1411713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1412713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato @Override 1413713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato public HealthStatsParceler[] takeUidSnapshots(int[] requestUids) { 1414713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (!onlyCaller(requestUids)) { 1415713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato mContext.enforceCallingOrSelfPermission( 1416713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato android.Manifest.permission.BATTERY_STATS, null); 1417713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1418713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato long ident = Binder.clearCallingIdentity(); 1419713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato int i=-1; 1420713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato try { 1421b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski awaitUninterruptibly(mWorker.scheduleSync("get-health-stats-for-uids", 1422b3a1badce56dc5714b8732a9d59b0a4a919ed9c1Adam Lesinski BatteryExternalStatsWorker.UPDATE_ALL)); 1423713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato synchronized (mStats) { 1424713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int N = requestUids.length; 1425713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsParceler[] results = new HealthStatsParceler[N]; 1426713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato for (i=0; i<N; i++) { 1427713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato results[i] = getHealthStatsForUidLocked(requestUids[i]); 1428713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1429713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return results; 1430713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1431713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } catch (Exception ex) { 143282ba91ddb4fe9d9ff8245e27f70dea64cc20553dJoe Onorato if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots(" 1433713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato + Arrays.toString(requestUids) + ") i=" + i, ex); 1434713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato throw ex; 1435713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } finally { 1436713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato Binder.restoreCallingIdentity(ident); 1437713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1438713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1439713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1440713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1441713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Returns whether the Binder.getCallingUid is the only thing in requestUids. 1442713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1443713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato private static boolean onlyCaller(int[] requestUids) { 1444713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int caller = Binder.getCallingUid(); 1445713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final int N = requestUids.length; 1446713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato for (int i=0; i<N; i++) { 1447713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (requestUids[i] != caller) { 1448713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return false; 1449713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1450713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1451713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return true; 1452713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1453713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 1454713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato /** 1455713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato * Gets a HealthStatsParceler for the given uid. You should probably call 1456010bf374d8145528f8733dfa6ef101b15de23a8dAdam Lesinski * updateExternalStatsSync first. 1457713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato */ 1458713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato HealthStatsParceler getHealthStatsForUidLocked(int requestUid) { 1459713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsBatteryStatsWriter writer = new HealthStatsBatteryStatsWriter(); 1460713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final HealthStatsWriter uidWriter = new HealthStatsWriter(UidHealthStats.CONSTANTS); 1461713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato final BatteryStats.Uid uid = mStats.getUidStats().get(requestUid); 1462713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato if (uid != null) { 1463713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato writer.writeUid(uidWriter, mStats, uid); 1464713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1465713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato return new HealthStatsParceler(uidWriter); 1466713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato } 1467713fec85b8612256211f09c62b8958a99fe5b9dbJoe Onorato 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1469