From 10000eb25481f3a733870fce18daf92c8679ff11 Mon Sep 17 00:00:00 2001 From: ykhung Date: Tue, 27 Apr 2021 16:16:13 +0800 Subject: [PATCH] Draw timestamp information into BatteryChartView manually (2/2) screenshot: https://screenshot.googleplex.com/8zJcMJeMDovfhdD Bug: 183921876 Test: make SettingsRoboTests Change-Id: I276f70c3cf8ebd2316f987ace0d6537ed2cf8a45 --- .../BatteryChartPreferenceController.java | 24 ++++++++ .../settings/fuelgauge/ConvertUtils.java | 5 ++ .../BatteryChartPreferenceControllerTest.java | 57 +++++++++++++++++-- 3 files changed, 82 insertions(+), 4 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java index 99e6b0db666..972fda140f8 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java @@ -40,6 +40,7 @@ import com.android.settingslib.core.lifecycle.events.OnDestroy; import com.android.settingslib.core.lifecycle.events.OnPause; import com.android.settingslib.utils.StringUtil; +import java.time.Clock; import java.util.Arrays; import java.util.ArrayList; import java.util.Collections; @@ -256,6 +257,7 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll : mTrapezoidIndex; if (mBatteryChartView != null) { mBatteryChartView.setLevels(mBatteryHistoryLevels); + setTimestampLabel(); } refreshUi(refreshIndex, /*isForce=*/ true); } @@ -525,6 +527,28 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll return true; } + @VisibleForTesting + void setTimestampLabel() { + if (mBatteryChartView == null || mBatteryHistoryKeys == null) { + return; + } + long latestTimestamp = + mBatteryHistoryKeys[mBatteryHistoryKeys.length - 1]; + // Uses the current time if we don't have history data. + if (latestTimestamp == 0) { + latestTimestamp = Clock.systemUTC().millis(); + } + // Generates timestamp label for chart graph (every 8 hours). + final long timeSlotOffset = DateUtils.HOUR_IN_MILLIS * 8; + final String[] timestampLabels = new String[4]; + for (int index = 0; index < timestampLabels.length; index++) { + timestampLabels[index] = + ConvertUtils.utcToLocalTimeHour( + latestTimestamp - (3 - index) * timeSlotOffset); + } + mBatteryChartView.setTimestamps(timestampLabels); + } + private static String utcToLocalTime(long[] timestamps) { final StringBuilder builder = new StringBuilder(); for (int index = 0; index < timestamps.length; index++) { diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java index 00dcb6be62b..7c3ebef52e3 100644 --- a/src/com/android/settings/fuelgauge/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/ConvertUtils.java @@ -196,6 +196,11 @@ public final class ConvertUtils { for (int index = 0; index < timeSlotSize; index++) { final Long currentTimestamp = Long.valueOf(batteryHistoryKeys[index * timestampStride]); + // Uses empty list if the timestamp is default value. + if (currentTimestamp == 0) { + resultMap.put(Integer.valueOf(index), new ArrayList()); + continue; + } final Long nextTimestamp = Long.valueOf(batteryHistoryKeys[index * timestampStride + 1]); final Long nextTwoTimestamp = diff --git a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java index d687c5dad68..35e3276f922 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/BatteryChartPreferenceControllerTest.java @@ -81,10 +81,7 @@ public final class BatteryChartPreferenceControllerTest { public void setUp() { MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application); - mBatteryChartPreferenceController = - new BatteryChartPreferenceController( - mContext, "app_list", /*lifecycle=*/ null, - mSettingsActivity, mFragment); + mBatteryChartPreferenceController = createController(); mBatteryChartPreferenceController.mPrefContext = mContext; mBatteryChartPreferenceController.mAppListPrefGroup = mAppListGroup; mBatteryChartPreferenceController.mBatteryChartView = mBatteryChartView; @@ -572,6 +569,52 @@ public final class BatteryChartPreferenceControllerTest { .isEqualTo("System usage for past 24 hr"); } + @Test + public void testSetTimestampLabel_nullBatteryHistoryKeys_ignore() { + mBatteryChartPreferenceController = createController(); + mBatteryChartPreferenceController.mBatteryHistoryKeys = null; + mBatteryChartPreferenceController.mBatteryChartView = + spy(new BatteryChartView(mContext)); + mBatteryChartPreferenceController.setTimestampLabel(); + + verify(mBatteryChartPreferenceController.mBatteryChartView, never()) + .setTimestamps(any()); + } + + @Test + public void testSetTimestampLabel_setExpectedTimestampData() { + mBatteryChartPreferenceController = createController(); + mBatteryChartPreferenceController.mBatteryChartView = + spy(new BatteryChartView(mContext)); + setUpBatteryHistoryKeys(); + // Generates the expected result. + final String[] expectedResults = new String[4]; + final long timeSlotOffset = DateUtils.HOUR_IN_MILLIS * 8; + for (int index = 0; index < expectedResults.length; index++) { + expectedResults[index] = + ConvertUtils.utcToLocalTimeHour( + 1619247636826L - (3 - index) * timeSlotOffset); + } + + mBatteryChartPreferenceController.setTimestampLabel(); + + verify(mBatteryChartPreferenceController.mBatteryChartView) + .setTimestamps(expectedResults); + } + + @Test + public void testSetTimestampLabel_withoutValidTimestamp_setExpectedTimestampData() { + mBatteryChartPreferenceController = createController(); + mBatteryChartPreferenceController.mBatteryChartView = + spy(new BatteryChartView(mContext)); + mBatteryChartPreferenceController.mBatteryHistoryKeys = new long[] {0L}; + + mBatteryChartPreferenceController.setTimestampLabel(); + + verify(mBatteryChartPreferenceController.mBatteryChartView) + .setTimestamps(any()); + } + private static Map> createBatteryHistoryMap(int size) { final Map> batteryHistoryMap = new HashMap<>(); for (int index = 0; index < size; index++) { @@ -598,4 +641,10 @@ public final class BatteryChartPreferenceControllerTest { ConvertUtils.sSimpleDateFormatForHour .setTimeZone(TimeZone.getTimeZone("GMT")); } + + private BatteryChartPreferenceController createController() { + return new BatteryChartPreferenceController( + mContext, "app_list", /*lifecycle=*/ null, + mSettingsActivity, mFragment); + } }