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

Commit 740f3482 authored by mxyyiyi's avatar mxyyiyi
Browse files

Remove redundant battery usage slot in database.

Bug: 336423923
Test: atest SettingsRoboTests:com.android.settings.fuelgauge.batteryusage
Change-Id: I1b2d172a42a20a8cc8dc734498e37ed92e4624dd
parent 893e8d1f
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -321,8 +321,17 @@ public final class ConvertUtils {
        final List<BatteryEvent> batteryEventList = new ArrayList<>();
        final List<BatteryLevelData.PeriodBatteryLevelData> levelDataList =
                batteryLevelData.getHourlyBatteryLevelsPerDay();
        for (BatteryLevelData.PeriodBatteryLevelData oneDayData : levelDataList) {
            for (int hourIndex = 0; hourIndex < oneDayData.getLevels().size() - 1; hourIndex++) {
        final int dailyDataSize = levelDataList.size();
        for (int dailyIndex = 0; dailyIndex < dailyDataSize; dailyIndex++) {
            final BatteryLevelData.PeriodBatteryLevelData oneDayData =
                    levelDataList.get(dailyIndex);
            final int hourDataSize = oneDayData.getLevels().size();
            for (int hourIndex = 0; hourIndex < hourDataSize; hourIndex++) {
                // For timestamp data on adjacent days, the last data (24:00) of the previous day is
                // equal to the first data (00:00) of the next day, so skip sending EVEN_HOUR event.
                if (dailyIndex < dailyDataSize - 1 && hourIndex == hourDataSize - 1) {
                    continue;
                }
                batteryEventList.add(
                        convertToBatteryEvent(
                                oneDayData.getTimestamps().get(hourIndex),
+17 −0
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.android.internal.annotations.VisibleForTesting;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -649,6 +650,22 @@ public class DataProcessManager {
        // Process raw history map data into hourly timestamps.
        final Map<Long, Map<String, BatteryHistEntry>> processedBatteryHistoryMap =
                DataProcessor.getHistoryMapWithExpectedTimestamps(context, batteryHistoryMap);
        if (isFromPeriodJob && !processedBatteryHistoryMap.isEmpty()) {
            // For periodic job, only generate battery usage data between even-hour timestamps.
            // Remove the timestamps:
            // 1) earlier than the latest completed period job (startTimestamp)
            // 2) later than current scheduled even-hour job (lastEvenHourTimestamp).
            final long lastEvenHourTimestamp = TimestampUtils.getLastEvenHourTimestamp(currentTime);
            final Set<Long> batteryHistMapKeySet = processedBatteryHistoryMap.keySet();
            final long minTimestamp = Collections.min(batteryHistMapKeySet);
            final long maxTimestamp = Collections.max(batteryHistMapKeySet);
            if (minTimestamp < startTimestamp) {
                processedBatteryHistoryMap.remove(minTimestamp);
            }
            if (maxTimestamp > lastEvenHourTimestamp) {
                processedBatteryHistoryMap.remove(maxTimestamp);
            }
        }
        // Wrap and processed history map into easy-to-use format for UI rendering.
        final BatteryLevelData batteryLevelData =
                DataProcessor.getLevelDataThroughProcessedHistoryMap(
+2 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import java.io.PrintWriter;
import java.time.Clock;
import java.time.Duration;
import java.util.List;
import java.util.TimeZone;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;

@@ -97,6 +98,7 @@ public final class LogUtils {
    static void dumpBatteryUsageSlotDatabaseHist(Context context, PrintWriter writer) {
        final BatteryUsageSlotDao dao =
                BatteryStateDatabase.getInstance(context).batteryUsageSlotDao();
        writer.println("\n\tBattery Usage Slot TimeZone ID: " + TimeZone.getDefault().getID());
        writer.println("\n\tBattery Usage Slot DatabaseHistory:");
        final List<BatteryUsageSlotEntity> entities =
                dao.getAllAfterForLog(getLastFullChargeTimestamp(context));
+28 −1
Original line number Diff line number Diff line
@@ -565,7 +565,9 @@ public final class ConvertUtilsTest {
    public void convertToBatteryEventList_normalCase_returnsExpectedResult() {
        final BatteryLevelData batteryLevelData =
                new BatteryLevelData(
                        Map.of(1691589600000L, 98, 1691596800000L, 90, 1691596812345L, 80));
                        // 2023-08-09 14:00:00 UTC
                        // 2023-08-09 16:00:00 UTC
                        Map.of(1691589600000L, 98, 1691596800000L, 90));

        final List<BatteryEvent> batteryEventList =
                ConvertUtils.convertToBatteryEventList(batteryLevelData);
@@ -579,6 +581,31 @@ public final class ConvertUtilsTest {
        assertThat(batteryEventList.get(1).getBatteryLevel()).isEqualTo(90);
    }

    @Test
    public void convertToBatteryEventList_multipleDays_returnsExpectedResult() {
        final BatteryLevelData batteryLevelData =
                new BatteryLevelData(
                        // 2024-04-23 22:00:00 UTC
                        // 2024-04-24 00:00:00 UTC
                        // 2024-04-24 02:00:00 UTC
                        Map.of(1713909600000L, 98, 1713916800000L, 90, 1713924000000L, 83));

        final List<BatteryEvent> batteryEventList =
                ConvertUtils.convertToBatteryEventList(batteryLevelData);

        assertThat(batteryEventList).hasSize(3);
        assertThat(batteryEventList.get(0).getTimestamp()).isEqualTo(1713909600000L);
        assertThat(batteryEventList.get(0).getType()).isEqualTo(BatteryEventType.EVEN_HOUR);
        assertThat(batteryEventList.get(0).getBatteryLevel()).isEqualTo(98);
        assertThat(batteryEventList.get(1).getTimestamp()).isEqualTo(1713916800000L);
        assertThat(batteryEventList.get(1).getType()).isEqualTo(BatteryEventType.EVEN_HOUR);
        assertThat(batteryEventList.get(1).getBatteryLevel()).isEqualTo(90);
        assertThat(batteryEventList.get(2).getTimestamp()).isEqualTo(1713924000000L);
        assertThat(batteryEventList.get(2).getType()).isEqualTo(BatteryEventType.EVEN_HOUR);
        assertThat(batteryEventList.get(2).getBatteryLevel()).isEqualTo(83);
    }


    @Test
    public void convertToBatteryUsageSlotList_normalCase_returnsExpectedResult() {
        BatteryDiffData batteryDiffData1 =