diff options
| author | 2021-04-15 20:00:22 +0000 | |
|---|---|---|
| committer | 2021-04-15 20:00:22 +0000 | |
| commit | 05f4f582b8573a98c05ffa420c2ee458e8e344ea (patch) | |
| tree | e27cc98f02b757d5d2011d6c3c988eeace65c9dd | |
| parent | af7af06b804102fe89ae8a23cd27b7c45b3ba7dc (diff) | |
| parent | 8b08e82d3185b2bba3c51e7d6ca204073a235f8d (diff) | |
Merge "Add method to remove file from history based on matching file path." into sc-dev
2 files changed, 62 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java index 8bd3b1e0b6ac..42b7c9d388a0 100644 --- a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java +++ b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java @@ -100,7 +100,7 @@ public class NotificationHistoryDatabase { IntentFilter deletionFilter = new IntentFilter(ACTION_HISTORY_DELETION); deletionFilter.addDataScheme(SCHEME_DELETION); - mContext.registerReceiver(mFileCleaupReceiver, deletionFilter); + mContext.registerReceiver(mFileCleanupReceiver, deletionFilter); } public void init() { @@ -273,13 +273,36 @@ public class NotificationHistoryDatabase { } } + /** + * Remove the first entry from the list of history files whose file matches the given file path. + * + * This method is necessary for anything that only has an absolute file path rather than an + * AtomicFile object from the list of history files. + * + * filePath should be an absolute path. + */ + void removeFilePathFromHistory(String filePath) { + if (filePath == null) { + return; + } + + Iterator<AtomicFile> historyFileItr = mHistoryFiles.iterator(); + while (historyFileItr.hasNext()) { + final AtomicFile af = historyFileItr.next(); + if (af != null && filePath.equals(af.getBaseFile().getAbsolutePath())) { + historyFileItr.remove(); + return; + } + } + } + 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.remove(file); + removeFilePathFromHistory(file.getBaseFile().getAbsolutePath()); } private void scheduleDeletion(File file, long creationTime, int retentionDays) { @@ -342,7 +365,7 @@ public class NotificationHistoryDatabase { } } - private final BroadcastReceiver mFileCleaupReceiver = new BroadcastReceiver() { + private final BroadcastReceiver mFileCleanupReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); @@ -358,7 +381,7 @@ public class NotificationHistoryDatabase { Slog.d(TAG, "Removed " + fileToDelete.getBaseFile().getName()); } fileToDelete.delete(); - mHistoryFiles.remove(fileToDelete); + removeFilePathFromHistory(filePath); } } catch (Exception e) { Slog.e(TAG, "Failed to delete notification history file", e); 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 809b6d561362..182848b4f628 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java @@ -123,6 +123,7 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { for (long i = cal.getTimeInMillis(); i >= 5; i--) { File file = mock(File.class); when(file.getName()).thenReturn(String.valueOf(i)); + when(file.getAbsolutePath()).thenReturn(String.valueOf(i)); AtomicFile af = new AtomicFile(file); expectedFiles.add(af); mDataBase.mHistoryFiles.addLast(af); @@ -133,6 +134,7 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { for (int i = 5; i >= 0; i--) { File file = mock(File.class); when(file.getName()).thenReturn(String.valueOf(cal.getTimeInMillis() - i)); + when(file.getAbsolutePath()).thenReturn(String.valueOf(cal.getTimeInMillis() - i)); AtomicFile af = new AtomicFile(file); mDataBase.mHistoryFiles.addLast(af); } @@ -158,6 +160,7 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { for (long i = cal.getTimeInMillis(); i >= 5; i--) { File file = mock(File.class); when(file.getName()).thenReturn(i + ".bak"); + when(file.getAbsolutePath()).thenReturn(i + ".bak"); AtomicFile af = new AtomicFile(file); mDataBase.mHistoryFiles.addLast(af); } @@ -415,4 +418,36 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { assertThat(mDataBase.mBuffer).isNotEqualTo(nh); verify(mAlarmManager, times(1)).setExactAndAllowWhileIdle(anyInt(), anyLong(), any()); } + + @Test + public void testRemoveFilePathFromHistory_hasMatch() throws Exception { + for (int i = 0; i < 5; i++) { + AtomicFile af = mock(AtomicFile.class); + when(af.getBaseFile()).thenReturn(new File(mRootDir, "af" + i)); + mDataBase.mHistoryFiles.addLast(af); + } + // Baseline size of history files + assertThat(mDataBase.mHistoryFiles.size()).isEqualTo(5); + + // Remove only file number 3 + String filePathToRemove = new File(mRootDir, "af3").getAbsolutePath(); + mDataBase.removeFilePathFromHistory(filePathToRemove); + assertThat(mDataBase.mHistoryFiles.size()).isEqualTo(4); + } + + @Test + public void testRemoveFilePathFromHistory_noMatch() throws Exception { + for (int i = 0; i < 5; i++) { + AtomicFile af = mock(AtomicFile.class); + when(af.getBaseFile()).thenReturn(new File(mRootDir, "af" + i)); + mDataBase.mHistoryFiles.addLast(af); + } + // Baseline size of history files + assertThat(mDataBase.mHistoryFiles.size()).isEqualTo(5); + + // Attempt to remove a filename that doesn't exist, expect nothing to break or change + String filePathToRemove = new File(mRootDir, "af.thisfileisfake").getAbsolutePath(); + mDataBase.removeFilePathFromHistory(filePathToRemove); + assertThat(mDataBase.mHistoryFiles.size()).isEqualTo(5); + } } |