From 866203a3b857e25e5a3a1360b868424ed2d1a007 Mon Sep 17 00:00:00 2001 From: Zaiyue Xue Date: Mon, 7 Nov 2022 15:08:48 +0800 Subject: [PATCH 1/2] Fix b/257404630 Inconsistent strings in battery chart Change all the "from last full charge" to "since last full charge". Bug: 257404630 Fix: 257404630 Test: presubmit Change-Id: Ib316e9fecac60f388e2b1810de9a65c540c52358 Merged-In: Ib316e9fecac60f388e2b1810de9a65c540c52358 --- res/values/strings.xml | 32 +++++++++---------- .../AdvancedPowerUsageDetailTest.java | 14 ++++---- .../batteryusage/PowerUsageSummaryTest.java | 2 +- 3 files changed, 24 insertions(+), 24 deletions(-) diff --git a/res/values/strings.xml b/res/values/strings.xml index 96ffb8d3480..32bfa1c3308 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -6372,8 +6372,8 @@ Battery usage View usage for past 24 hours - - View usage from last full charge + + View usage since last full charge App battery usage @@ -6748,50 +6748,50 @@ Manage battery usage - - ^1 total • ^2 background\nfrom last full charge + + ^1 total • ^2 background\nsince last full charge ^1 total • ^2 background\nfor past 24 hr ^1 total • ^2 background\nfor ^3 - - Total less than a minute from last full charge + + Total less than a minute since last full charge Total less than a minute for past 24 hr Total less than a minute for ^1 - - Background less than a minute from last full charge + + Background less than a minute since last full charge Background less than a minute for past 24 hr Background less than a minute for ^1 - - ^1 total from last full charge + + ^1 total since last full charge ^1 total for past 24 hr ^1 total for ^2 - - ^1 background from last full charge + + ^1 background since last full charge ^1 background for past 24 hr ^1 background for ^2 - - ^1 total • background less than a minute\nfrom last full charge + + ^1 total • background less than a minute\nsince last full charge ^1 total • background less than a minute\nfor past 24 hr ^1 total • background less than a minute\nfor ^2 - - No usage from last full charge + + No usage since last full charge No usage for past 24 hr diff --git a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java index 7c56ab393f0..6a1280f69e4 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/AdvancedPowerUsageDetailTest.java @@ -467,7 +467,7 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); assertThat(captor.getValue().toString()) - .isEqualTo("2 min background from last full charge"); + .isEqualTo("2 min background since last full charge"); } @Test @@ -485,7 +485,7 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); assertThat(captor.getValue().toString()) - .isEqualTo("Background less than a minute from last full charge"); + .isEqualTo("Background less than a minute since last full charge"); } @Test @@ -504,7 +504,7 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); assertThat(captor.getValue().toString()) - .isEqualTo("Total less than a minute from last full charge"); + .isEqualTo("Total less than a minute since last full charge"); } @Test @@ -520,8 +520,8 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); - assertThat(captor.getValue().toString()) - .isEqualTo("1 min total • background less than a minute\nfrom last full charge"); + assertThat(captor.getValue().toString()).isEqualTo( + "1 min total • background less than a minute\nsince last full charge"); } @Test @@ -538,7 +538,7 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); assertThat(captor.getValue().toString()) - .isEqualTo("1 min total from last full charge"); + .isEqualTo("1 min total since last full charge"); } @Test @@ -555,7 +555,7 @@ public class AdvancedPowerUsageDetailTest { ArgumentCaptor captor = ArgumentCaptor.forClass(CharSequence.class); verify(mEntityHeaderController).setSummary(captor.capture()); assertThat(captor.getValue().toString()) - .isEqualTo("6 min total • 4 min background\nfrom last full charge"); + .isEqualTo("6 min total • 4 min background\nsince last full charge"); } @Test diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java index c0494972f35..fa049f8fa35 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/PowerUsageSummaryTest.java @@ -142,7 +142,7 @@ public class PowerUsageSummaryTest { public void initPreference_hasCorrectSummary() { mFragment.initPreference(); - verify(mBatteryUsagePreference).setSummary("View usage from last full charge"); + verify(mBatteryUsagePreference).setSummary("View usage since last full charge"); } @Test From 57cb76428e1cb521f9553b7bd8b96440417a2daf Mon Sep 17 00:00:00 2001 From: Kuan Wang Date: Mon, 31 Oct 2022 16:40:24 +0800 Subject: [PATCH 2/2] Remove the timestamps of last day for battery level chart if last day has less than 2 hours data. Test: make RunSettingsRoboTests Bug: 256525782 Change-Id: I3f735f8f3ec10b2952b93111f0243e44117ff58a --- .../fuelgauge/batteryusage/DataProcessor.java | 25 ++++++- .../batteryusage/DataProcessorTest.java | 73 ++++++++++++++++++- 2 files changed, 93 insertions(+), 5 deletions(-) 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();