Loading services/core/java/com/android/server/power/stats/BatteryHistoryStepDetailsProvider.java +27 −7 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ class BatteryHistoryStepDetailsProvider { public static final String TAG = "BatteryHistoryStepDetails"; private static final boolean DEBUG = false; private static final int BOOT_TIME_UPDATE_DELAY_MILLIS = 20000; private static final int POWER_STATS_QUERY_TIMEOUT_MILLIS = 2000; private static final int MAX_LOW_POWER_STATS_SIZE = 32768; Loading Loading @@ -70,23 +71,30 @@ class BatteryHistoryStepDetailsProvider { private long mCurStepStatSoftIrqTimeMs; private long mCurStepStatIdleTimeMs; private boolean mSystemReady; private boolean mPowerStatsReady; private PowerStatsInternal mPowerStatsInternal; private final Map<Integer, String> mEntityNames = new HashMap<>(); private final Map<Integer, Map<Integer, String>> mStateNames = new HashMap<>(); private Map<Integer, String> mEntityNames; private Map<Integer, Map<Integer, String>> mStateNames; private boolean mFirstUpdate = true; private final Runnable mUpdateRunnable = this::update; BatteryHistoryStepDetailsProvider(BatteryStatsImpl batteryStats) { mBatteryStats = batteryStats; } void onSystemReady() { mPowerStatsInternal = LocalServices.getService(PowerStatsInternal.class); if (mPowerStatsInternal != null) { populatePowerEntityMaps(); } mSystemReady = true; } void requestUpdate() { mBatteryStats.mHandler.post(this::update); mBatteryStats.mHandler.removeCallbacks(mUpdateRunnable); if (!mSystemReady || mFirstUpdate) { mBatteryStats.mHandler.postDelayed(mUpdateRunnable, BOOT_TIME_UPDATE_DELAY_MILLIS); } else { mBatteryStats.mHandler.post(mUpdateRunnable); } } void update() { Loading @@ -97,6 +105,7 @@ class BatteryHistoryStepDetailsProvider { mBatteryStats.getHistory().recordHistoryStepDetails(mDetails, mBatteryStats.mClock.elapsedRealtime(), mBatteryStats.mClock.uptimeMillis()); mFirstUpdate = false; } private void calculateHistoryStepDetails() { Loading Loading @@ -212,6 +221,14 @@ class BatteryHistoryStepDetailsProvider { private void updateStateResidency() { mDetails.statSubsystemPowerState = null; if (!mPowerStatsReady) { mPowerStatsInternal = LocalServices.getService(PowerStatsInternal.class); if (mPowerStatsInternal != null) { populatePowerEntityMaps(); } mPowerStatsReady = true; } if (mPowerStatsInternal == null || mEntityNames.isEmpty() || mStateNames.isEmpty()) { return; } Loading Loading @@ -257,6 +274,9 @@ class BatteryHistoryStepDetailsProvider { } private void populatePowerEntityMaps() { mEntityNames = new HashMap<>(); mStateNames = new HashMap<>(); PowerEntity[] entities = mPowerStatsInternal.getPowerEntityInfo(); if (entities == null) { return; Loading services/tests/powerstatstests/src/com/android/server/power/stats/BatteryHistoryStepDetailsProviderTest.java +9 −4 Original line number Diff line number Diff line Loading @@ -21,13 +21,16 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import android.annotation.NonNull; import android.content.Context; import android.os.BatteryManager; import android.os.BatteryStats; import android.os.ConditionVariable; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Process; import android.os.SystemClock; import android.power.PowerStatsInternal; import androidx.test.ext.junit.runners.AndroidJUnit4; Loading @@ -41,8 +44,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Random; @RunWith(AndroidJUnit4.class) @android.platform.test.annotations.DisabledOnRavenwood(reason = "PowerStatsInternal is not supported under Ravenwood") Loading @@ -52,13 +53,17 @@ public class BatteryHistoryStepDetailsProviderTest { private final MockClock mMockClock = new MockClock(); private MockBatteryStatsImpl mBatteryStats; private final Random mRandom = new Random(); private Handler mHandler; @Before public void setup() { mMockClock.currentTime = 3000; mHandler = new Handler(Looper.getMainLooper()); mHandler = new Handler(Looper.getMainLooper()) { public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) { // Process delayed messages immediately. return super.sendMessageAtTime(msg, SystemClock.uptimeMillis()); } }; mBatteryStats = new MockBatteryStatsImpl(mMockClock, null, mHandler, mock(PowerProfile.class)); mBatteryStats.setRecordAllHistoryLocked(true); Loading Loading
services/core/java/com/android/server/power/stats/BatteryHistoryStepDetailsProvider.java +27 −7 Original line number Diff line number Diff line Loading @@ -35,6 +35,7 @@ class BatteryHistoryStepDetailsProvider { public static final String TAG = "BatteryHistoryStepDetails"; private static final boolean DEBUG = false; private static final int BOOT_TIME_UPDATE_DELAY_MILLIS = 20000; private static final int POWER_STATS_QUERY_TIMEOUT_MILLIS = 2000; private static final int MAX_LOW_POWER_STATS_SIZE = 32768; Loading Loading @@ -70,23 +71,30 @@ class BatteryHistoryStepDetailsProvider { private long mCurStepStatSoftIrqTimeMs; private long mCurStepStatIdleTimeMs; private boolean mSystemReady; private boolean mPowerStatsReady; private PowerStatsInternal mPowerStatsInternal; private final Map<Integer, String> mEntityNames = new HashMap<>(); private final Map<Integer, Map<Integer, String>> mStateNames = new HashMap<>(); private Map<Integer, String> mEntityNames; private Map<Integer, Map<Integer, String>> mStateNames; private boolean mFirstUpdate = true; private final Runnable mUpdateRunnable = this::update; BatteryHistoryStepDetailsProvider(BatteryStatsImpl batteryStats) { mBatteryStats = batteryStats; } void onSystemReady() { mPowerStatsInternal = LocalServices.getService(PowerStatsInternal.class); if (mPowerStatsInternal != null) { populatePowerEntityMaps(); } mSystemReady = true; } void requestUpdate() { mBatteryStats.mHandler.post(this::update); mBatteryStats.mHandler.removeCallbacks(mUpdateRunnable); if (!mSystemReady || mFirstUpdate) { mBatteryStats.mHandler.postDelayed(mUpdateRunnable, BOOT_TIME_UPDATE_DELAY_MILLIS); } else { mBatteryStats.mHandler.post(mUpdateRunnable); } } void update() { Loading @@ -97,6 +105,7 @@ class BatteryHistoryStepDetailsProvider { mBatteryStats.getHistory().recordHistoryStepDetails(mDetails, mBatteryStats.mClock.elapsedRealtime(), mBatteryStats.mClock.uptimeMillis()); mFirstUpdate = false; } private void calculateHistoryStepDetails() { Loading Loading @@ -212,6 +221,14 @@ class BatteryHistoryStepDetailsProvider { private void updateStateResidency() { mDetails.statSubsystemPowerState = null; if (!mPowerStatsReady) { mPowerStatsInternal = LocalServices.getService(PowerStatsInternal.class); if (mPowerStatsInternal != null) { populatePowerEntityMaps(); } mPowerStatsReady = true; } if (mPowerStatsInternal == null || mEntityNames.isEmpty() || mStateNames.isEmpty()) { return; } Loading Loading @@ -257,6 +274,9 @@ class BatteryHistoryStepDetailsProvider { } private void populatePowerEntityMaps() { mEntityNames = new HashMap<>(); mStateNames = new HashMap<>(); PowerEntity[] entities = mPowerStatsInternal.getPowerEntityInfo(); if (entities == null) { return; Loading
services/tests/powerstatstests/src/com/android/server/power/stats/BatteryHistoryStepDetailsProviderTest.java +9 −4 Original line number Diff line number Diff line Loading @@ -21,13 +21,16 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import android.annotation.NonNull; import android.content.Context; import android.os.BatteryManager; import android.os.BatteryStats; import android.os.ConditionVariable; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.Process; import android.os.SystemClock; import android.power.PowerStatsInternal; import androidx.test.ext.junit.runners.AndroidJUnit4; Loading @@ -41,8 +44,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Random; @RunWith(AndroidJUnit4.class) @android.platform.test.annotations.DisabledOnRavenwood(reason = "PowerStatsInternal is not supported under Ravenwood") Loading @@ -52,13 +53,17 @@ public class BatteryHistoryStepDetailsProviderTest { private final MockClock mMockClock = new MockClock(); private MockBatteryStatsImpl mBatteryStats; private final Random mRandom = new Random(); private Handler mHandler; @Before public void setup() { mMockClock.currentTime = 3000; mHandler = new Handler(Looper.getMainLooper()); mHandler = new Handler(Looper.getMainLooper()) { public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) { // Process delayed messages immediately. return super.sendMessageAtTime(msg, SystemClock.uptimeMillis()); } }; mBatteryStats = new MockBatteryStatsImpl(mMockClock, null, mHandler, mock(PowerProfile.class)); mBatteryStats.setRecordAllHistoryLocked(true); Loading