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

Commit 08228df2 authored by Benjamin Schwartz's avatar Benjamin Schwartz
Browse files

BatteryStatsService: Check for power stats initialization

Bug: 179733419
Test: No longer see crashing
Change-Id: I8a1f8f055482269fc1960ed9b98e85e92c0d06a1
parent 17373ec5
Loading
Loading
Loading
Loading
+27 −12
Original line number Diff line number Diff line
@@ -128,13 +128,18 @@ public final class BatteryStatsService extends IBatteryStats.Stub
                    .replaceWith("?");
    private static final int MAX_LOW_POWER_STATS_SIZE = 4096;
    private static final int POWER_STATS_QUERY_TIMEOUT_MILLIS = 2000;
    private static final String EMPTY = "Empty";

    private final HandlerThread mHandlerThread;
    private final Handler mHandler;
    private final Object mLock = new Object();

    private final Object mPowerStatsLock = new Object();
    @GuardedBy("mPowerStatsLock")
    private PowerStatsInternal mPowerStatsInternal = null;
    @GuardedBy("mPowerStatsLock")
    private Map<Integer, String> mEntityNames = new HashMap();
    @GuardedBy("mPowerStatsLock")
    private Map<Integer, Map<Integer, String>> mStateNames = new HashMap();

    @GuardedBy("mStats")
@@ -172,13 +177,6 @@ public final class BatteryStatsService extends IBatteryStats.Stub
            };

    private void populatePowerEntityMaps() {
        if (mPowerStatsInternal == null) {
            // PowerStatsInternal unavailable, don't bother populating maps.
            mEntityNames = null;
            mStateNames = null;
            return;
        }

        PowerEntity[] entities = mPowerStatsInternal.getPowerEntityInfo();
        if (entities == null) {
            return;
@@ -202,6 +200,12 @@ public final class BatteryStatsService extends IBatteryStats.Stub
     */
    @Override
    public void fillLowPowerStats(RpmStats rpmStats) {
        synchronized (mPowerStatsLock) {
            if (mPowerStatsInternal == null || mEntityNames.isEmpty() || mStateNames.isEmpty()) {
                return;
            }
        }

        final StateResidencyResult[] results;
        try {
            results = mPowerStatsInternal.getStateResidencyAsync(new int[0])
@@ -237,16 +241,22 @@ public final class BatteryStatsService extends IBatteryStats.Stub

    @Override
    public String getSubsystemLowPowerStats() {
        synchronized (mPowerStatsLock) {
            if (mPowerStatsInternal == null || mEntityNames.isEmpty() || mStateNames.isEmpty()) {
                return EMPTY;
            }
        }

        final StateResidencyResult[] results;
        try {
            results = mPowerStatsInternal.getStateResidencyAsync(new int[0])
                    .get(POWER_STATS_QUERY_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
        } catch (Exception e) {
            Slog.e(TAG, "Failed to getStateResidencyAsync", e);
            return "Empty";
            return EMPTY;
        }

        if (results.length == 0) return "Empty";
        if (results.length == 0) return EMPTY;

        int charsLeft = MAX_LOW_POWER_STATS_SIZE;
        StringBuilder builder = new StringBuilder("SubsystemPowerState");
@@ -322,9 +332,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub
        } catch (RemoteException e) {
            Slog.e(TAG, "Could not register INetworkManagement event observer " + e);
        }

        synchronized (mPowerStatsLock) {
            mPowerStatsInternal = LocalServices.getService(PowerStatsInternal.class);
            if (mPowerStatsInternal != null) {
                populatePowerEntityMaps();
            } else {
                Slog.e(TAG, "Could not register PowerStatsInternal");
            }
        }

        Watchdog.getInstance().addMonitor(this);