diff --git a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
index ff139f0..9d2774e 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/DataProcessor.java
@@ -18,7 +18,6 @@
 
 import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.utcToLocalTime;
 
-import android.app.settings.SettingsEnums;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
@@ -48,7 +47,6 @@
 import com.android.settings.Utils;
 import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.fuelgauge.BatteryStatus;
 
 import java.time.Duration;
@@ -437,16 +435,10 @@
         insertDailyUsageDiffData(hourlyBatteryLevelsPerDay, resultMap);
         // Insert diff data [SELECTED_INDEX_ALL][SELECTED_INDEX_ALL].
         insertAllUsageDiffData(resultMap);
-        // Compute the apps number before purge. Must put before purgeLowPercentageAndFakeData.
-        final int countOfAppBeforePurge = getCountOfApps(resultMap);
         purgeFakeAndHiddenPackages(context, resultMap);
-        // Compute the apps number after purge. Must put after purgeLowPercentageAndFakeData.
-        final int countOfAppAfterPurge = getCountOfApps(resultMap);
         if (!isUsageMapValid(resultMap, hourlyBatteryLevelsPerDay)) {
             return null;
         }
-
-        logAppCountMetrics(context, countOfAppBeforePurge, countOfAppAfterPurge);
         return resultMap;
     }
 
@@ -531,14 +523,7 @@
         allUsageMap.put(SELECTED_INDEX_ALL,
                 generateBatteryDiffData(context, getBatteryHistListFromFromStatsService(context)));
         resultMap.put(SELECTED_INDEX_ALL, allUsageMap);
-
-        // Compute the apps number before purge. Must put before purgeLowPercentageAndFakeData.
-        final int countOfAppBeforePurge = getCountOfApps(resultMap);
         purgeFakeAndHiddenPackages(context, resultMap);
-        // Compute the apps number after purge. Must put after purgeLowPercentageAndFakeData.
-        final int countOfAppAfterPurge = getCountOfApps(resultMap);
-
-        logAppCountMetrics(context, countOfAppBeforePurge, countOfAppAfterPurge);
         return resultMap;
     }
 
@@ -1350,15 +1335,6 @@
         return calendar.getTimeInMillis();
     }
 
-    private static int getCountOfApps(final Map<Integer, Map<Integer, BatteryDiffData>> resultMap) {
-        final BatteryDiffData diffDataList =
-                resultMap.get(SELECTED_INDEX_ALL).get(SELECTED_INDEX_ALL);
-        return diffDataList == null
-                ? 0
-                : diffDataList.getAppDiffEntryList().size()
-                        + diffDataList.getSystemDiffEntryList().size();
-    }
-
     private static boolean contains(String target, Set<CharSequence> packageNames) {
         if (target != null && packageNames != null) {
             for (CharSequence packageName : packageNames) {
@@ -1414,21 +1390,6 @@
         return sFakeCurrentTimeMillis > 0 ? sFakeCurrentTimeMillis : System.currentTimeMillis();
     }
 
-    private static void logAppCountMetrics(
-            Context context, final int countOfAppBeforePurge, final int countOfAppAfterPurge) {
-        context = context.getApplicationContext();
-        final MetricsFeatureProvider metricsFeatureProvider =
-                FeatureFactory.getFactory(context).getMetricsFeatureProvider();
-        metricsFeatureProvider.action(
-                context,
-                SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT,
-                countOfAppAfterPurge);
-        metricsFeatureProvider.action(
-                context,
-                SettingsEnums.ACTION_BATTERY_USAGE_HIDDEN_APP_COUNT,
-                countOfAppBeforePurge - countOfAppAfterPurge);
-    }
-
     /**
      * @return Returns whether the target is in the CharSequence array.
      */
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 5b69e7c..210a21b 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/DataProcessorTest.java
@@ -22,12 +22,9 @@
 import static org.mockito.Mockito.anyInt;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import android.app.settings.SettingsEnums;
 import android.content.ContentValues;
 import android.content.Context;
 import android.content.Intent;
@@ -39,7 +36,6 @@
 import com.android.settings.fuelgauge.BatteryUtils;
 import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -65,7 +61,6 @@
     private Context mContext;
 
     private FakeFeatureFactory mFeatureFactory;
-    private MetricsFeatureProvider mMetricsFeatureProvider;
     private PowerUsageFeatureProvider mPowerUsageFeatureProvider;
 
     @Mock private Intent mIntent;
@@ -83,7 +78,6 @@
 
         mContext = spy(RuntimeEnvironment.application);
         mFeatureFactory = FakeFeatureFactory.setupForTest();
-        mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
         mPowerUsageFeatureProvider = mFeatureFactory.powerUsageFeatureProvider;
 
         doReturn(mIntent).when(mContext).registerReceiver(any(), any());
@@ -102,10 +96,6 @@
         assertThat(DataProcessor.getBatteryLevelData(
                 mContext, /*handler=*/ null, new HashMap<>(), /*asyncResponseDelegate=*/ null))
                 .isNull();
-        verify(mMetricsFeatureProvider, never())
-                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT);
-        verify(mMetricsFeatureProvider, never())
-                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_HIDDEN_APP_COUNT);
     }
 
     @Test
@@ -123,10 +113,6 @@
         assertThat(DataProcessor.getBatteryLevelData(
                 mContext, /*handler=*/ null, batteryHistoryMap, /*asyncResponseDelegate=*/ null))
                 .isNull();
-        verify(mMetricsFeatureProvider, never())
-                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT);
-        verify(mMetricsFeatureProvider, never())
-                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_HIDDEN_APP_COUNT);
     }
 
     @Test
@@ -541,10 +527,6 @@
 
         assertThat(DataProcessor.getBatteryUsageMap(
                 mContext, hourlyBatteryLevelsPerDay, new HashMap<>())).isNull();
-        verify(mMetricsFeatureProvider, never())
-                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT);
-        verify(mMetricsFeatureProvider, never())
-                .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_HIDDEN_APP_COUNT);
     }
 
     @Test
@@ -713,14 +695,6 @@
                 /*foregroundUsageConsumePower=*/ 5, /*foregroundServiceUsageConsumePower=*/ 5,
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
                 /*foregroundUsageTimeInMs=*/ 50, /*backgroundUsageTimeInMs=*/ 60);
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT,
-                        3);
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_HIDDEN_APP_COUNT,
-                        0);
     }
 
     @Test
@@ -843,14 +817,6 @@
                 /*foregroundUsageTimeInMs=*/ 0, /*backgroundUsageTimeInMs=*/ 0);
         assertThat(resultMap.get(0).get(0)).isNotNull();
         assertThat(resultMap.get(0).get(DataProcessor.SELECTED_INDEX_ALL)).isNotNull();
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT,
-                        2);
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_HIDDEN_APP_COUNT,
-                        0);
     }
 
     @Test
@@ -929,14 +895,6 @@
                 .isEqualTo(entry.mCachedUsageConsumePower * ratio);
         assertThat(resultMap.get(0).get(0)).isNotNull();
         assertThat(resultMap.get(0).get(DataProcessor.SELECTED_INDEX_ALL)).isNotNull();
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT,
-                        1);
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_HIDDEN_APP_COUNT,
-                        0);
     }
 
     @Test
@@ -1028,14 +986,6 @@
                 /*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
                 /*backgroundUsageConsumePower=*/ 5, /*cachedUsageConsumePower=*/ 5,
                 /*foregroundUsageTimeInMs=*/ 10, /*backgroundUsageTimeInMs=*/ 20);
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT,
-                        1);
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_HIDDEN_APP_COUNT,
-                        1);
     }
 
     @Test
@@ -1125,14 +1075,6 @@
         assertThat(resultEntry.mBackgroundUsageTimeInMs).isEqualTo(20);
         resultEntry = resultDiffData.getAppDiffEntryList().get(1);
         assertThat(resultEntry.mBackgroundUsageTimeInMs).isEqualTo(0);
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_SHOWN_APP_COUNT,
-                        2);
-        verify(mMetricsFeatureProvider)
-                .action(mContext.getApplicationContext(),
-                        SettingsEnums.ACTION_BATTERY_USAGE_HIDDEN_APP_COUNT,
-                        0);
     }
 
     @Test
