From b1a0ea777e1e52b077f4d18ff6591406bd53bb8a Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 3 Mar 2020 17:32:27 -0500 Subject: [PATCH] Persist pending notification history on shutdown and reboot Test: manual, post notification, reboot device, confirm notification is in history Fixes: 150716177 Change-Id: I45ac3e6e3ea9e777c5b4dc2bb07140f5e39f2c93 --- .../android/server/notification/NotificationDelegate.java | 2 ++ .../server/notification/NotificationHistoryDatabase.java | 4 +--- .../server/notification/NotificationHistoryManager.java | 1 - .../server/notification/NotificationManagerService.java | 5 +++++ .../android/server/statusbar/StatusBarManagerService.java | 2 ++ .../server/notification/NotificationHistoryDatabaseTest.java | 4 ++-- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationDelegate.java b/services/core/java/com/android/server/notification/NotificationDelegate.java index feb4f0edcc0de..b8140be2e2663 100644 --- a/services/core/java/com/android/server/notification/NotificationDelegate.java +++ b/services/core/java/com/android/server/notification/NotificationDelegate.java @@ -87,4 +87,6 @@ public interface NotificationDelegate { */ void onNotificationSmartReplySent(String key, int clickedIndex, CharSequence reply, int notificationLocation, boolean modifiedBeforeSending); + + void prepareForPossibleShutdown(); } diff --git a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java index 2e8b76ee75fad..2ed6e16bd9894 100644 --- a/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java +++ b/services/core/java/com/android/server/notification/NotificationHistoryDatabase.java @@ -157,9 +157,7 @@ public class NotificationHistoryDatabase { } public void forceWriteToDisk() { - if (!mFileWriteHandler.hasCallbacks(mWriteBufferRunnable)) { - mFileWriteHandler.post(mWriteBufferRunnable); - } + mFileWriteHandler.post(mWriteBufferRunnable); } public void onPackageRemoved(String packageName) { diff --git a/services/core/java/com/android/server/notification/NotificationHistoryManager.java b/services/core/java/com/android/server/notification/NotificationHistoryManager.java index ab37f67b3db8b..7d680127740c1 100644 --- a/services/core/java/com/android/server/notification/NotificationHistoryManager.java +++ b/services/core/java/com/android/server/notification/NotificationHistoryManager.java @@ -181,7 +181,6 @@ public class NotificationHistoryManager { } } - // TODO: wire this up to AMS when power button is long pressed public void triggerWriteToDisk() { synchronized (mLock) { final int userCount = mUserState.size(); diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index d139cd119df8d..b5e7ea0731f3b 100755 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -875,6 +875,11 @@ public class NotificationManagerService extends SystemService { @VisibleForTesting final NotificationDelegate mNotificationDelegate = new NotificationDelegate() { + @Override + public void prepareForPossibleShutdown() { + mHistoryManager.triggerWriteToDisk(); + } + @Override public void onSetDisabled(int status) { synchronized (mNotificationLock) { diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 19fb660208281..feb3e06c172e1 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -1169,6 +1169,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D enforceStatusBarService(); long identity = Binder.clearCallingIdentity(); try { + mNotificationDelegate.prepareForPossibleShutdown(); // ShutdownThread displays UI, so give it a UI context. mHandler.post(() -> ShutdownThread.shutdown(getUiContext(), @@ -1186,6 +1187,7 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D enforceStatusBarService(); long identity = Binder.clearCallingIdentity(); try { + mNotificationDelegate.prepareForPossibleShutdown(); mHandler.post(() -> { // ShutdownThread displays UI, so give it a UI context. if (safeMode) { 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 7e5469090d82e..3991d8d4a47ca 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationHistoryDatabaseTest.java @@ -162,10 +162,10 @@ public class NotificationHistoryDatabaseTest extends UiServiceTestCase { } @Test - public void testOnlyOneWriteRunnableInQueue() { + public void testForceWriteToDisk_bypassesExistingWrites() { when(mFileWriteHandler.hasCallbacks(any())).thenReturn(true); mDataBase.forceWriteToDisk(); - verify(mFileWriteHandler, never()).post(any()); + verify(mFileWriteHandler, times(1)).post(any()); } @Test