diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java index b9c3a6ff7f3..86533ba07c3 100644 --- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java +++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java @@ -67,6 +67,7 @@ public final class DataProcessor { private static final int MAX_DIFF_SECONDS_OF_UPPER_TIMESTAMP = 5; // Maximum total time value for each hourly slot cumulative data at most 2 hours. private static final float TOTAL_HOURLY_TIME_THRESHOLD = DateUtils.HOUR_IN_MILLIS * 2; + private static final long MIN_TIME_SLOT = DateUtils.HOUR_IN_MILLIS * 2; private static final Map EMPTY_BATTERY_MAP = new HashMap<>(); private static final BatteryHistEntry EMPTY_BATTERY_HIST_ENTRY = new BatteryHistEntry(new ContentValues()); @@ -270,13 +271,31 @@ public final class DataProcessor { } final long startTime = timestampList.get(0); final long endTime = timestampList.get(timestampList.size() - 1); + // If the timestamp diff is smaller than MIN_TIME_SLOT, returns the empty list directly. + if (endTime - startTime < MIN_TIME_SLOT) { + return dailyTimestampList; + } long nextDay = getTimestampOfNextDay(startTime); - dailyTimestampList.add(startTime); + // Only if the timestamp diff in the first day is bigger than MIN_TIME_SLOT, start from the + // first day. Otherwise, start from the second day. + if (nextDay - startTime >= MIN_TIME_SLOT) { + dailyTimestampList.add(startTime); + } while (nextDay < endTime) { dailyTimestampList.add(nextDay); nextDay += DateUtils.DAY_IN_MILLIS; } - dailyTimestampList.add(endTime); + final long lastDailyTimestamp = dailyTimestampList.get(dailyTimestampList.size() - 1); + // Only if the timestamp diff in the last day is bigger than MIN_TIME_SLOT, add the + // last day. + if (endTime - lastDailyTimestamp >= MIN_TIME_SLOT) { + dailyTimestampList.add(endTime); + } + // The dailyTimestampList must have the start and end timestamp, otherwise, return an empty + // list. + if (dailyTimestampList.size() < MIN_TIMESTAMP_DATA_SIZE) { + return new ArrayList<>(); + } return dailyTimestampList; } @@ -721,7 +740,7 @@ public final class DataProcessor { final List hourlyTimestampsPerDay = new ArrayList<>(); while (currentTimestamp <= dailyEndTimestamp) { hourlyTimestampsPerDay.add(currentTimestamp); - currentTimestamp += 2 * DateUtils.HOUR_IN_MILLIS; + currentTimestamp += MIN_TIME_SLOT; } hourlyTimestamps.add(hourlyTimestampsPerDay); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java index df9d8655109..7ac8fdeec58 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java @@ -329,6 +329,18 @@ public class DataProcessorTest { public void getDailyTimestamps_notEnoughData_returnEmptyList() { assertThat(DataProcessor.getDailyTimestamps(new ArrayList<>())).isEmpty(); assertThat(DataProcessor.getDailyTimestamps(List.of(100L))).isEmpty(); + assertThat(DataProcessor.getDailyTimestamps(List.of(100L, 5400000L))).isEmpty(); + } + + @Test + public void getDailyTimestamps_OneHourDataPerDay_returnEmptyList() { + // Timezone GMT+8 + final List timestamps = List.of( + 1641049200000L, // 2022-01-01 23:00:00 + 1641052800000L, // 2022-01-02 00:00:00 + 1641056400000L // 2022-01-02 01:00:00 + ); + assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEmpty(); } @Test @@ -353,14 +365,33 @@ public class DataProcessorTest { public void getDailyTimestamps_MultipleDaysData_returnExpectedList() { // Timezone GMT+8 final List timestamps = List.of( - 1640988000000L, // 2022-01-01 06:00:00 + 1641045600000L, // 2022-01-01 22:00:00 + 1641060000000L, // 2022-01-02 02:00:00 + 1641160800000L, // 2022-01-03 06:00:00 + 1641232800000L // 2022-01-04 02:00:00 + ); + + final List expectedTimestamps = List.of( + 1641045600000L, // 2022-01-01 22:00:00 + 1641052800000L, // 2022-01-02 00:00:00 + 1641139200000L, // 2022-01-03 00:00:00 + 1641225600000L, // 2022-01-04 00:00:00 + 1641232800000L // 2022-01-04 02:00:00 + ); + assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps); + } + + @Test + public void getDailyTimestamps_FirstDayOneHourData_returnExpectedList() { + // Timezone GMT+8 + final List timestamps = List.of( + 1641049200000L, // 2022-01-01 23:00:00 1641060000000L, // 2022-01-02 02:00:00 1641160800000L, // 2022-01-03 06:00:00 1641254400000L // 2022-01-04 08:00:00 ); final List expectedTimestamps = List.of( - 1640988000000L, // 2022-01-01 06:00:00 1641052800000L, // 2022-01-02 00:00:00 1641139200000L, // 2022-01-03 00:00:00 1641225600000L, // 2022-01-04 00:00:00 @@ -369,6 +400,44 @@ public class DataProcessorTest { assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps); } + @Test + public void getDailyTimestamps_LastDayNoData_returnExpectedList() { + // Timezone GMT+8 + final List timestamps = List.of( + 1640988000000L, // 2022-01-01 06:00:00 + 1641060000000L, // 2022-01-02 02:00:00 + 1641160800000L, // 2022-01-03 06:00:00 + 1641225600000L // 2022-01-04 00:00:00 + ); + + final List expectedTimestamps = List.of( + 1640988000000L, // 2022-01-01 06:00:00 + 1641052800000L, // 2022-01-02 00:00:00 + 1641139200000L, // 2022-01-03 00:00:00 + 1641225600000L // 2022-01-04 00:00:00 + ); + assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps); + } + + @Test + public void getDailyTimestamps_LastDayOneHourData_returnExpectedList() { + // Timezone GMT+8 + final List timestamps = List.of( + 1640988000000L, // 2022-01-01 06:00:00 + 1641060000000L, // 2022-01-02 02:00:00 + 1641160800000L, // 2022-01-03 06:00:00 + 1641229200000L // 2022-01-04 01:00:00 + ); + + final List expectedTimestamps = List.of( + 1640988000000L, // 2022-01-01 06:00:00 + 1641052800000L, // 2022-01-02 00:00:00 + 1641139200000L, // 2022-01-03 00:00:00 + 1641225600000L // 2022-01-04 00:00:00 + ); + assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps); + } + @Test public void isFromFullCharge_emptyData_returnFalse() { assertThat(DataProcessor.isFromFullCharge(null)).isFalse();