Purge low percentage BatteryDiffEntry from indexed usage map

Bug: 184807417
Test: make SettingsRoboTests
Test: make SettingsGoogleRoboTests
Change-Id: I943e224147ccbfa80578511d6cb0d6adf6f8da0f
diff --git a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
index 8b1c6b5..cc7f8455 100644
--- a/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/BatteryChartPreferenceController.java
@@ -152,7 +152,8 @@
         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 0155412..30982da 100644
--- a/src/com/android/settings/fuelgauge/ConvertUtils.java
+++ b/src/com/android/settings/fuelgauge/ConvertUtils.java
@@ -24,6 +24,8 @@
 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.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 @@
     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 @@
             final Context context,
             final int timeSlotSize,
             final long[] batteryHistoryKeys,
-            final Map<Long, List<BatteryHistEntry>> batteryHistoryMap) {
+            final Map<Long, List<BatteryHistEntry>> batteryHistoryMap,
+            final boolean purgeLowPercentageData) {
         final Map<Integer, List<BatteryDiffEntry>> resultMap = new HashMap<>();
         // Generates a temporary map to calculate diff usage data, which converts the inputted
         // List<BatteryDiffEntry> into Map<String, BatteryHistEntry> with the key comes from
@@ -248,6 +255,9 @@
             }
         }
         insert24HoursData(BatteryChartView.SELECTED_INDEX_ALL, resultMap);
+        if (purgeLowPercentageData) {
+            purgeLowPercentageData(resultMap);
+        }
         return resultMap;
     }
 
@@ -283,6 +293,19 @@
         indexedUsageMap.put(Integer.valueOf(desiredIndex), resultList);
     }
 
+    private static void purgeLowPercentageData(
+            final Map<Integer, List<BatteryDiffEntry>> indexedUsageMap) {
+        for (List<BatteryDiffEntry> entries : indexedUsageMap.values()) {
+            final Iterator<BatteryDiffEntry> 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 cfd23c9..e95b158 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 @@
 
         final Map<Integer, List<BatteryDiffEntry>> 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 @@
         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<Integer, List<BatteryDiffEntry>> 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(