diff --git a/core/java/com/android/internal/os/BatteryUsageStatsStore.java b/core/java/com/android/internal/os/BatteryUsageStatsStore.java index 09c9cfcd2e71b..04f72c7d703d5 100644 --- a/core/java/com/android/internal/os/BatteryUsageStatsStore.java +++ b/core/java/com/android/internal/os/BatteryUsageStatsStore.java @@ -320,4 +320,19 @@ public class BatteryUsageStatsStore { mFileSizes.remove(file); } } + + public void removeAllSnapshots() { + lockSnapshotDirectory(); + try { + for (File file : mStoreDir.listFiles()) { + if (file.getName().endsWith(SNAPSHOT_FILE_EXTENSION)) { + if (!file.delete()) { + Slog.e(TAG, "Cannot delete battery usage stats " + file); + } + } + } + } finally { + unlockSnapshotDirectory(); + } + } } diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsStoreTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsStoreTest.java index 21f6e7c82d7fb..c9729fab3b5e4 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsStoreTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryUsageStatsStoreTest.java @@ -131,6 +131,26 @@ public class BatteryUsageStatsStoreTest { .isAtMost(MAX_BATTERY_STATS_SNAPSHOT_STORAGE_BYTES); } + @Test + public void testRemoveAllSnapshots() throws Exception { + prepareBatteryStats(); + + for (int i = 0; i < 3; i++) { + mMockClock.realtime += 10_000_000; + mMockClock.uptime += 10_000_000; + mMockClock.currentTime += 10_000_000; + prepareBatteryStats(); + + mBatteryStats.resetAllStatsCmdLocked(); + } + + assertThat(getDirectorySize(mStoreDirectory)).isNotEqualTo(0); + + mBatteryUsageStatsStore.removeAllSnapshots(); + + assertThat(getDirectorySize(mStoreDirectory)).isEqualTo(0); + } + @Test public void testSavingStatsdAtomPullTimestamp() { mBatteryUsageStatsStore.setLastBatteryUsageStatsBeforeResetAtomPullTimestamp(1234); diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 7253b49466617..7fe3c1f5272b9 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -2260,7 +2260,8 @@ public final class BatteryStatsService extends IBatteryStats.Stub private void dumpHelp(PrintWriter pw) { pw.println("Battery stats (batterystats) dump options:"); pw.println(" [--checkin] [--proto] [--history] [--history-start] [--charged] [-c]"); - pw.println(" [--daily] [--reset] [--write] [--new-daily] [--read-daily] [-h] []"); + pw.println(" [--daily] [--reset] [--reset-all] [--write] [--new-daily] [--read-daily]"); + pw.println(" [-h] []"); pw.println(" --checkin: generate output for a checkin report; will write (and clear) the"); pw.println(" last old completed stats when they had been reset."); pw.println(" -c: write the current stats in checkin format."); @@ -2271,6 +2272,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub pw.println(" --charged: only output data since last charged."); pw.println(" --daily: only output full daily data."); pw.println(" --reset: reset the stats, clearing all current data."); + pw.println(" --reset-all: reset the stats, clearing all current and past data."); pw.println(" --write: force write current collected stats to disk."); pw.println(" --new-daily: immediately create and write new daily stats record."); pw.println(" --read-daily: read-load last written daily stats."); @@ -2407,6 +2409,14 @@ public final class BatteryStatsService extends IBatteryStats.Stub flags |= BatteryStats.DUMP_CHARGED_ONLY; } else if ("--daily".equals(arg)) { flags |= BatteryStats.DUMP_DAILY_ONLY; + } else if ("--reset-all".equals(arg)) { + awaitCompletion(); + synchronized (mStats) { + mStats.resetAllStatsCmdLocked(); + mBatteryUsageStatsStore.removeAllSnapshots(); + pw.println("Battery stats and history reset."); + noOutput = true; + } } else if ("--reset".equals(arg)) { awaitCompletion(); synchronized (mStats) {