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

Commit 31dca320 authored by Dmitri Plotnikov's avatar Dmitri Plotnikov
Browse files

Capture estimated battery capacity when unspecified in power profile

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

Change-Id: I4c11c74e6a0dfc6e3d8566d20c90fe3756dba0b8
parent dedeb1e8
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -347,7 +347,7 @@ public class BatteryStatsImpl extends BatteryStats {
            return mChargeTimeRemainingMs;
        }
        double getEstimatedBatteryCapacity() {
        long getEstimatedBatteryCapacity() {
            return mEstimatedBatteryCapacityMah;
        }
@@ -1801,6 +1801,7 @@ public class BatteryStatsImpl extends BatteryStats {
    private int mNumConnectivityChange;
    private int mEstimatedBatteryCapacityMah = -1;
    private int mReportedBatteryCapacityMah = -1;
    private int mLastLearnedBatteryCapacityUah = -1;
    private int mMinLearnedBatteryCapacityUah = -1;
@@ -11256,10 +11257,8 @@ public class BatteryStatsImpl extends BatteryStats {
            mKernelCpuSpeedReaders[i] = new KernelCpuSpeedReader(cpus[0], freqs.length);
        }
        if (mEstimatedBatteryCapacityMah == -1) {
        // Initialize the estimated battery capacity to a known preset one.
        mEstimatedBatteryCapacityMah = (int) mPowerProfile.getBatteryCapacity();
        }
        setDisplayCountLocked(mPowerProfile.getNumDisplays());
    }
@@ -11772,10 +11771,8 @@ public class BatteryStatsImpl extends BatteryStats {
            mPerDisplayBatteryStats[i].reset(elapsedRealtimeUs);
        }
        if (mPowerProfile != null) {
        if (mEstimatedBatteryCapacityMah <= 0 && mPowerProfile != null) {
            mEstimatedBatteryCapacityMah = (int) mPowerProfile.getBatteryCapacity();
        } else {
            mEstimatedBatteryCapacityMah = -1;
        }
        mLastLearnedBatteryCapacityUah = -1;
        mMinLearnedBatteryCapacityUah = -1;
@@ -14176,10 +14173,6 @@ public class BatteryStatsImpl extends BatteryStats {
                }
                doWrite = true;
                startNewSession(RESET_REASON_FULL_CHARGE);
                if (chargeUah > 0 && level > 0) {
                    // Only use the reported coulomb charge value if it is supported and reported.
                    mEstimatedBatteryCapacityMah = (int) ((chargeUah / 1000) / (level / 100.0));
                }
                reset = true;
                mDischargeStepTracker.init();
            }
@@ -14295,6 +14288,17 @@ public class BatteryStatsImpl extends BatteryStats {
        }
        int oldStatus = mBatteryStatus;
        if (onBattery) {
            if (mReportedBatteryCapacityMah <= 0) {
                if (chargeFullUah > 0) {
                    mReportedBatteryCapacityMah = chargeFullUah / 1000;
                    mEstimatedBatteryCapacityMah = mReportedBatteryCapacityMah;
                } else if (chargeUah > 0 && level > 25) {
                    // Only use the reported coulomb charge value if it is supported and reported.
                    mReportedBatteryCapacityMah = (int) ((chargeUah / 1000.0) / (level / 100.0));
                    mEstimatedBatteryCapacityMah = mReportedBatteryCapacityMah;
                }
            }
            mDischargeCurrentLevel = level;
            if (!mHistory.isRecordingHistory()) {
                mHistory.startRecordingHistory(elapsedRealtimeMs, uptimeMs, true);
+4 −1
Original line number Diff line number Diff line
@@ -296,7 +296,10 @@ public class BatteryUsageStatsProvider {

    private void populateBatterySessionInfo(BatteryUsageStats.Builder builder,
            BatteryStatsSession session) {
        builder.setBatteryCapacity(session.getEstimatedBatteryCapacity());
        double estimatedBatteryCapacity = session.getEstimatedBatteryCapacity();
        if (estimatedBatteryCapacity > 0) {
            builder.setBatteryCapacity(estimatedBatteryCapacity);
        }
        builder.setBatteryTimeRemainingMs(session.getBatteryTimeRemainingMs());
        builder.setChargeTimeRemainingMs(session.getChargeTimeRemainingMs());
    }
+23 −11
Original line number Diff line number Diff line
@@ -105,7 +105,7 @@ public class BatteryUsageStatsProviderTest {

    @Test
    public void test_getBatteryUsageStats() throws IOException {
        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(false);
        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(false, false);

        final List<UidBatteryConsumer> uidBatteryConsumers =
                batteryUsageStats.getUidBatteryConsumers();
@@ -136,7 +136,7 @@ public class BatteryUsageStatsProviderTest {

    @Test
    public void batteryLevelInfo_charging() throws IOException {
        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(true);
        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(true, false);
        assertThat(batteryUsageStats.getBatteryCapacity()).isEqualTo(4000.0);
        assertThat(batteryUsageStats.getChargeTimeRemainingMs()).isEqualTo(1_200_000);
        batteryUsageStats.close();
@@ -144,16 +144,24 @@ public class BatteryUsageStatsProviderTest {

    @Test
    public void batteryLevelInfo_onBattery() throws IOException {
        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(false);
        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(false, false);
        assertThat(batteryUsageStats.getBatteryCapacity()).isEqualTo(4000.0);
        assertThat(batteryUsageStats.getBatteryTimeRemainingMs()).isEqualTo(600_000);
        batteryUsageStats.close();
    }

    @Test
    public void batteryLevelInfo_reportedBatteryCapacity() throws IOException {
        final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(false, true);
        // From setBatteryStateLocked(..., 5_000_000, ...)
        assertThat(batteryUsageStats.getBatteryCapacity()).isEqualTo(5000.0);
        batteryUsageStats.close();
    }

    @Ignore("BatteryUsageStatsQuery.includePowerComponents is unsupported")
    @Test
    public void test_selectPowerComponents() throws IOException {
        BatteryStatsImpl batteryStats = prepareBatteryStats(false);
        BatteryStatsImpl batteryStats = prepareBatteryStats(false, true);

        BatteryUsageStatsProvider provider = createBatteryUsageStatsProvider(0);
        final BatteryUsageStats batteryUsageStats =
@@ -178,14 +186,17 @@ public class BatteryUsageStatsProviderTest {
        batteryUsageStats.close();
    }

    private BatteryStatsImpl prepareBatteryStats(boolean plugInAtTheEnd) {
    private BatteryStatsImpl prepareBatteryStats(boolean plugInAtTheEnd,
            boolean fullChargeReported) {
        BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats();
        batteryStats.setNoAutoReset(true);
        batteryStats.onSystemReady(mContext);

        int chargeFullUah = fullChargeReported ? 5_000_000 : 0;

        synchronized (batteryStats) {
            batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING,
                    100, /* plugType */ 0, 90, 72, 3700, 3_600_000, 4_000_000, 0, 0,
                    100, /* plugType */ 0, 90, 72, 3700, 3_600_000, chargeFullUah, 0, 0,
                    0, 0);
        }

@@ -245,13 +256,13 @@ public class BatteryUsageStatsProviderTest {

        synchronized (batteryStats) {
            batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING,
                    100, /* plugType */ 0, 60, 72, 3700, 2_600_000, 4_000_000, 0,
                    100, /* plugType */ 0, 60, 72, 3700, 2_600_000, chargeFullUah, 0,
                    100 * MINUTE_IN_MS, 100 * MINUTE_IN_MS, 21000);
        }

        synchronized (batteryStats) {
            batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_DISCHARGING,
                    100, /* plugType */ 0, 30, 72, 3700, 1_600_000, 4_000_000, 0,
                    100, /* plugType */ 0, 30, 72, 3700, 1_600_000, chargeFullUah, 0,
                    110 * MINUTE_IN_MS, 110 * MINUTE_IN_MS, 21000);
        }

@@ -259,7 +270,7 @@ public class BatteryUsageStatsProviderTest {
            synchronized (batteryStats) {
                batteryStats.setBatteryStateLocked(BatteryManager.BATTERY_STATUS_CHARGING,
                        100, /* plugType */ BatteryManager.BATTERY_PLUGGED_USB, 30, 72, 3700,
                        1_600_000, 4_000_000, /* chargeTimeToFullSeconds */ 20 * 60,
                        1_600_000, chargeFullUah, /* chargeTimeToFullSeconds */ 20 * 60,
                        120 * MINUTE_IN_MS, 120 * MINUTE_IN_MS, 22000);
            }
        }
@@ -269,8 +280,9 @@ public class BatteryUsageStatsProviderTest {
        return batteryStats;
    }

    private BatteryUsageStats prepareBatteryUsageStats(boolean plugInAtTheEnd) {
        BatteryStatsImpl batteryStats = prepareBatteryStats(plugInAtTheEnd);
    private BatteryUsageStats prepareBatteryUsageStats(boolean plugInAtTheEnd,
            boolean fullChargeReported) {
        BatteryStatsImpl batteryStats = prepareBatteryStats(plugInAtTheEnd, fullChargeReported);
        BatteryUsageStatsProvider provider = createBatteryUsageStatsProvider(0);

        return provider.getBatteryUsageStats(batteryStats, BatteryUsageStatsQuery.DEFAULT);