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(
