Loading services/core/java/com/android/server/notification/NotificationHistoryDatabase.java +26 −17 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ public class NotificationHistoryDatabase { private static final int HISTORY_RETENTION_DAYS = 1; private static final int HISTORY_RETENTION_MS = 24 * 60 * 60 * 1000; private static final long WRITE_BUFFER_INTERVAL_MS = 1000 * 60 * 20; private static final long INVALID_FILE_TIME_MS = -1; private static final String ACTION_HISTORY_DELETION = NotificationHistoryDatabase.class.getSimpleName() + ".CLEANUP"; Loading Loading @@ -130,8 +131,8 @@ public class NotificationHistoryDatabase { } // Sort with newest files first Arrays.sort(files, (lhs, rhs) -> Long.compare(Long.parseLong(rhs.getName()), Long.parseLong(lhs.getName()))); Arrays.sort(files, (lhs, rhs) -> Long.compare(safeParseLong(rhs.getName()), safeParseLong(lhs.getName()))); for (File file : files) { mHistoryFiles.addLast(new AtomicFile(file)); Loading Loading @@ -252,13 +253,13 @@ public class NotificationHistoryDatabase { for (int i = mHistoryFiles.size() - 1; i >= 0; i--) { final AtomicFile currentOldestFile = mHistoryFiles.get(i); try { final long creationTime = Long.parseLong( final long creationTime = safeParseLong( currentOldestFile.getBaseFile().getName()); if (DEBUG) { Slog.d(TAG, "File " + currentOldestFile.getBaseFile().getName() + " created on " + creationTime); } if (creationTime <= retentionBoundary.getTimeInMillis()) { deleteFile(currentOldestFile); } else { Loading @@ -266,9 +267,6 @@ public class NotificationHistoryDatabase { scheduleDeletion( currentOldestFile.getBaseFile(), creationTime, retentionDays); } } catch (NumberFormatException e) { deleteFile(currentOldestFile); } } } } Loading Loading @@ -331,6 +329,17 @@ public class NotificationHistoryDatabase { } } private static long safeParseLong(String fileName) { // AtomicFile will create copies of the numeric files with ".new" and ".bak" // over the course of its processing. If these files still exist on boot we need to clean // them up try { return Long.parseLong(fileName); } catch (NumberFormatException e) { return INVALID_FILE_TIME_MS; } } private final BroadcastReceiver mFileCleaupReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { } @Test public void testPrune_badFileName() { public void testPrune_badFileName_noCrash() { GregorianCalendar cal = new GregorianCalendar(); cal.setTimeInMillis(10); int retainDays = 1; Loading @@ -159,7 +159,7 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { // 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"); when(file.getName()).thenReturn(i + ".bak"); AtomicFile af = new AtomicFile(file); mDataBase.mHistoryFiles.addLast(af); } Loading Loading
services/core/java/com/android/server/notification/NotificationHistoryDatabase.java +26 −17 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ public class NotificationHistoryDatabase { private static final int HISTORY_RETENTION_DAYS = 1; private static final int HISTORY_RETENTION_MS = 24 * 60 * 60 * 1000; private static final long WRITE_BUFFER_INTERVAL_MS = 1000 * 60 * 20; private static final long INVALID_FILE_TIME_MS = -1; private static final String ACTION_HISTORY_DELETION = NotificationHistoryDatabase.class.getSimpleName() + ".CLEANUP"; Loading Loading @@ -130,8 +131,8 @@ public class NotificationHistoryDatabase { } // Sort with newest files first Arrays.sort(files, (lhs, rhs) -> Long.compare(Long.parseLong(rhs.getName()), Long.parseLong(lhs.getName()))); Arrays.sort(files, (lhs, rhs) -> Long.compare(safeParseLong(rhs.getName()), safeParseLong(lhs.getName()))); for (File file : files) { mHistoryFiles.addLast(new AtomicFile(file)); Loading Loading @@ -252,13 +253,13 @@ public class NotificationHistoryDatabase { for (int i = mHistoryFiles.size() - 1; i >= 0; i--) { final AtomicFile currentOldestFile = mHistoryFiles.get(i); try { final long creationTime = Long.parseLong( final long creationTime = safeParseLong( currentOldestFile.getBaseFile().getName()); if (DEBUG) { Slog.d(TAG, "File " + currentOldestFile.getBaseFile().getName() + " created on " + creationTime); } if (creationTime <= retentionBoundary.getTimeInMillis()) { deleteFile(currentOldestFile); } else { Loading @@ -266,9 +267,6 @@ public class NotificationHistoryDatabase { scheduleDeletion( currentOldestFile.getBaseFile(), creationTime, retentionDays); } } catch (NumberFormatException e) { deleteFile(currentOldestFile); } } } } Loading Loading @@ -331,6 +329,17 @@ public class NotificationHistoryDatabase { } } private static long safeParseLong(String fileName) { // AtomicFile will create copies of the numeric files with ".new" and ".bak" // over the course of its processing. If these files still exist on boot we need to clean // them up try { return Long.parseLong(fileName); } catch (NumberFormatException e) { return INVALID_FILE_TIME_MS; } } private final BroadcastReceiver mFileCleaupReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Loading
services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java +2 −2 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { } @Test public void testPrune_badFileName() { public void testPrune_badFileName_noCrash() { GregorianCalendar cal = new GregorianCalendar(); cal.setTimeInMillis(10); int retainDays = 1; Loading @@ -159,7 +159,7 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { // 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"); when(file.getName()).thenReturn(i + ".bak"); AtomicFile af = new AtomicFile(file); mDataBase.mHistoryFiles.addLast(af); } Loading