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

Commit 530acdaa authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Delay initial battery history step update to improve boot time" into main

parents 75beed6e 8d9fc290
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);