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