Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d9fc290 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Delay initial battery history step update to improve boot time

Bug: 405301724
Test: atest PowerStatsTests
Flag: EXEMPT bug fix

Change-Id: I650b475f4bcbb78a6088c158b67eca270de4376d
parent 46bca737
Loading
Loading
Loading
Loading
+27 −7
Original line number Diff line number Diff line
@@ -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;

@@ -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() {
@@ -97,6 +105,7 @@ class BatteryHistoryStepDetailsProvider {
        mBatteryStats.getHistory().recordHistoryStepDetails(mDetails,
                mBatteryStats.mClock.elapsedRealtime(),
                mBatteryStats.mClock.uptimeMillis());
        mFirstUpdate = false;
    }

    private void calculateHistoryStepDetails() {
@@ -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;
        }
@@ -257,6 +274,9 @@ class BatteryHistoryStepDetailsProvider {
    }

    private void populatePowerEntityMaps() {
        mEntityNames = new HashMap<>();
        mStateNames = new HashMap<>();

        PowerEntity[] entities = mPowerStatsInternal.getPowerEntityInfo();
        if (entities == null) {
            return;
+9 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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")
@@ -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);