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