Loading src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java +11 −2 Original line number Diff line number Diff line Loading @@ -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), Loading src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java +17 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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( Loading src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java +28 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 = Loading Loading
src/com/android/settings/fuelgauge/batteryusage/ConvertUtils.java +11 −2 Original line number Diff line number Diff line Loading @@ -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), Loading
src/com/android/settings/fuelgauge/batteryusage/DataProcessManager.java +17 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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( Loading
src/com/android/settings/fuelgauge/batteryusage/bugreport/LogUtils.java +2 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)); Loading
tests/robotests/src/com/android/settings/fuelgauge/batteryusage/ConvertUtilsTest.java +28 −1 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 = Loading