Merge "Handle malnamed files in history dir" into rvc-dev
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
index 2ed6e16..bfc76df 100644
--- a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
+++ b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java
@@ -250,26 +250,36 @@
 
             for (int i = mHistoryFiles.size() - 1; i >= 0; i--) {
                 final AtomicFile currentOldestFile = mHistoryFiles.get(i);
-                final long creationTime = Long.parseLong(currentOldestFile.getBaseFile().getName());
-                if (DEBUG) {
-                    Slog.d(TAG, "File " + currentOldestFile.getBaseFile().getName()
-                            + " created on " + creationTime);
-                }
-                if (creationTime <= retentionBoundary.getTimeInMillis()) {
+                try {
+                    final long creationTime = Long.parseLong(
+                            currentOldestFile.getBaseFile().getName());
                     if (DEBUG) {
-                        Slog.d(TAG, "Removed " + currentOldestFile.getBaseFile().getName());
+                        Slog.d(TAG, "File " + currentOldestFile.getBaseFile().getName()
+                                + " created on " + creationTime);
                     }
-                    currentOldestFile.delete();
-                    // TODO: delete all relevant bitmaps, once they exist
-                    mHistoryFiles.removeLast();
-                } else {
-                    // all remaining files are newer than the cut off; schedule jobs to delete
-                    scheduleDeletion(currentOldestFile.getBaseFile(), creationTime, retentionDays);
+                    if (creationTime <= retentionBoundary.getTimeInMillis()) {
+                        deleteFile(currentOldestFile);
+                    } else {
+                        // all remaining files are newer than the cut off; schedule jobs to delete
+                        scheduleDeletion(
+                                currentOldestFile.getBaseFile(), creationTime, retentionDays);
+                    }
+                } catch (NumberFormatException e) {
+                    deleteFile(currentOldestFile);
                 }
             }
         }
     }
 
+    private void deleteFile(AtomicFile file) {
+        if (DEBUG) {
+            Slog.d(TAG, "Removed " + file.getBaseFile().getName());
+        }
+        file.delete();
+        // TODO: delete all relevant bitmaps, once they exist
+        mHistoryFiles.removeLast();
+    }
+
     private void scheduleDeletion(File file, long creationTime, int retentionDays) {
         final long deletionTime = creationTime + (retentionDays * HISTORY_RETENTION_MS);
         scheduleDeletion(file, deletionTime);
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
index 3991d8d..80b474f 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java
@@ -146,7 +146,29 @@
         assertThat(mDataBase.mHistoryFiles).containsExactlyElementsIn(expectedFiles);
 
         verify(mAlarmManager, times(6)).setExactAndAllowWhileIdle(anyInt(), anyLong(), any());
+    }
 
+    @Test
+    public void testPrune_badFileName() {
+        GregorianCalendar cal = new GregorianCalendar();
+        cal.setTimeInMillis(10);
+        int retainDays = 1;
+
+        List<AtomicFile> expectedFiles = new ArrayList<>();
+
+        // add 5 files with a creation date of "today", but the file names are bad
+        for (long i = cal.getTimeInMillis(); i >= 5; i--) {
+            File file = mock(File.class);
+            when(file.getName()).thenReturn(i + ".txt");
+            AtomicFile af = new AtomicFile(file);
+            mDataBase.mHistoryFiles.addLast(af);
+        }
+
+        // trim everything a day+ old
+        cal.add(Calendar.DATE, 1 * retainDays);
+        mDataBase.prune(retainDays, cal.getTimeInMillis());
+
+        assertThat(mDataBase.mHistoryFiles).containsExactlyElementsIn(expectedFiles);
     }
 
     @Test