diff options
author | Julia Reynolds <juliacr@google.com> | 2020-04-03 13:33:47 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-04-03 13:33:47 +0000 |
commit | cb83004e121df9ecef10d601cae32c849b15cf88 (patch) | |
tree | b7b38faba5cdacded5401e0101c6032ab6c52be0 | |
parent | 12a5e353fe16ae15aa72c344c9f81d8d7e0ea5bb (diff) | |
parent | 281e02a7723c2abde68d6fc359847cd4eb235cb7 (diff) |
Merge "Handle malnamed files in history dir" into rvc-dev
2 files changed, 45 insertions, 13 deletions
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java index 2ed6e16bd989..bfc76df90cf3 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 @@ public class NotificationHistoryDatabase { 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 3991d8d4a47c..80b474ff7128 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 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { 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 |