From 3cdf60c01663ddb52b3dfb567e30a7e97b8f8cfc Mon Sep 17 00:00:00 2001 From: ykhung Date: Sat, 17 Apr 2021 00:47:48 +0800 Subject: [PATCH] Purge low percentage BatteryDiffEntry from indexed usage map Bug: 184807417 Test: make SettingsRoboTests Test: make SettingsGoogleRoboTests Change-Id: I943e224147ccbfa80578511d6cb0d6adf6f8da0f --- .../BatteryChartPreferenceController.java | 3 ++- .../settings/fuelgauge/ConvertUtils.java | 25 ++++++++++++++++++- .../settings/fuelgauge/ConvertUtilsTest.java | 23 ++++++++++++++++- 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java index 8b1c6b5e8bb..cc7f84553d7 100644 --- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java +++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java @@ -152,7 +152,8 @@ public class BatteryChartPreferenceController extends AbstractPreferenceControll mBatteryIndexedMap = ConvertUtils.getIndexedUsageMap( mPrefContext, /*timeSlotSize=*/ CHART_LEVEL_ARRAY_SIZE - 1, - mBatteryHistoryKeys, batteryHistoryMap); + mBatteryHistoryKeys, batteryHistoryMap, + /*purgeLowPercentageData=*/ true); forceRefreshUi(); Log.d(TAG, String.format( diff --git a/src/com/android/settings/fuelgauge/ConvertUtils.java b/src/com/android/settings/fuelgauge/ConvertUtils.java index 015541295c3..30982da6c8d 100644 --- a/src/com/android/settings/fuelgauge/ConvertUtils.java +++ b/src/com/android/settings/fuelgauge/ConvertUtils.java @@ -24,6 +24,8 @@ import android.os.UserBatteryConsumer; import android.os.UserHandle; import android.util.Log; +import androidx.annotation.VisibleForTesting; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.text.SimpleDateFormat; @@ -31,6 +33,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -44,6 +47,9 @@ public final class ConvertUtils { private static final BatteryHistEntry EMPTY_BATTERY_HIST_ENTRY = new BatteryHistEntry(new ContentValues()); + @VisibleForTesting + static double PERCENTAGE_OF_TOTAL_THRESHOLD = 1f; + /** Invalid system battery consumer drain type. */ public static final int INVALID_DRAIN_TYPE = -1; /** A fake package name to represent no BatteryEntry data. */ @@ -142,7 +148,8 @@ public final class ConvertUtils { final Context context, final int timeSlotSize, final long[] batteryHistoryKeys, - final Map> batteryHistoryMap) { + final Map> batteryHistoryMap, + final boolean purgeLowPercentageData) { final Map> resultMap = new HashMap<>(); // Generates a temporary map to calculate diff usage data, which converts the inputted // List into Map with the key comes from @@ -248,6 +255,9 @@ public final class ConvertUtils { } } insert24HoursData(BatteryChartView.SELECTED_INDEX_ALL, resultMap); + if (purgeLowPercentageData) { + purgeLowPercentageData(resultMap); + } return resultMap; } @@ -283,6 +293,19 @@ public final class ConvertUtils { indexedUsageMap.put(Integer.valueOf(desiredIndex), resultList); } + private static void purgeLowPercentageData( + final Map> indexedUsageMap) { + for (List entries : indexedUsageMap.values()) { + final Iterator iterator = entries.iterator(); + while (iterator.hasNext()) { + final BatteryDiffEntry entry = iterator.next(); + if (entry.getPercentOfTotal() < PERCENTAGE_OF_TOTAL_THRESHOLD) { + iterator.remove(); + } + } + } + } + private static long getDiffValue(long v1, long v2, long v3) { return (v2 > v1 ? v2 - v1 : 0) + (v3 > v2 ? v3 - v2 : 0); } diff --git a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java index cfd23c9a410..e95b158391b 100644 --- a/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java +++ b/tests/robotests/src/com/android/settings/fuelgauge/ConvertUtilsTest.java @@ -212,7 +212,8 @@ public final class ConvertUtilsTest { final Map> resultMap = ConvertUtils.getIndexedUsageMap( - mContext, timeSlotSize, batteryHistoryKeys, batteryHistoryMap); + mContext, timeSlotSize, batteryHistoryKeys, batteryHistoryMap, + /*purgeLowPercentageData=*/ false); assertThat(resultMap).hasSize(3); // Verifies the first timestamp result. @@ -231,6 +232,26 @@ public final class ConvertUtilsTest { assertBatteryDiffEntry(entryList.get(1), 4, 5L, 5L); assertBatteryDiffEntry(entryList.get(2), 68, 40L, 50L); assertBatteryDiffEntry(entryList.get(0), 27, 30L, 40L); + + // Test getIndexedUsageMap() with purged data. + ConvertUtils.PERCENTAGE_OF_TOTAL_THRESHOLD = 50; + final Map> purgedResultMap = + ConvertUtils.getIndexedUsageMap( + mContext, timeSlotSize, batteryHistoryKeys, batteryHistoryMap, + /*purgeLowPercentageData=*/ true); + + assertThat(purgedResultMap).hasSize(3); + // Verifies the first timestamp result. + entryList = purgedResultMap.get(Integer.valueOf(0)); + assertThat(entryList).hasSize(1); + // Verifies the second timestamp result. + entryList = purgedResultMap.get(Integer.valueOf(1)); + assertThat(entryList).hasSize(1); + assertBatteryDiffEntry(entryList.get(0), 75, 40L, 50L); + // Verifies the last 24 hours aggregate result. + entryList = purgedResultMap.get(Integer.valueOf(-1)); + assertThat(entryList).hasSize(1); + assertBatteryDiffEntry(entryList.get(0), 68, 40L, 50L); } private static BatteryHistEntry createBatteryHistEntry(