From d62f9fbcc5e9b018fce13b3ba6ec0af6f0983f2f Mon Sep 17 00:00:00 2001 From: Will Date: Tue, 29 Mar 2022 17:22:09 -0700 Subject: [PATCH] Fetch active notifications on a background thread. Avoid a potential ANR by moving a call to getActiveNotifications to a background thread. Test: atest DreamOverlayNotificationCountProviderTest Bug: 227237503 Change-Id: I1fd0e110498fdb1d96cef018e6a2d5d6c362675e --- .../DreamOverlayNotificationCountProvider.java | 14 +++++++++++--- .../DreamOverlayNotificationCountProviderTest.java | 3 ++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayNotificationCountProvider.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayNotificationCountProvider.java index aaa34ed32c7e3..6589f26dbde29 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayNotificationCountProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayNotificationCountProvider.java @@ -21,6 +21,7 @@ import android.service.notification.NotificationListenerService; import android.service.notification.StatusBarNotification; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationListener.NotificationHandler; import com.android.systemui.statusbar.policy.CallbackController; @@ -30,6 +31,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; +import java.util.concurrent.Executor; import javax.inject.Inject; @@ -78,10 +80,16 @@ public class DreamOverlayNotificationCountProvider @Inject public DreamOverlayNotificationCountProvider( - NotificationListener notificationListener) { + NotificationListener notificationListener, + @Background Executor bgExecutor) { notificationListener.addNotificationHandler(mNotificationHandler); - Arrays.stream(notificationListener.getActiveNotifications()) - .forEach(sbn -> mNotificationKeys.add(sbn.getKey())); + + bgExecutor.execute(() -> { + Arrays.stream(notificationListener.getActiveNotifications()) + .forEach(sbn -> mNotificationKeys.add(sbn.getKey())); + reportNotificationCountChanged(); + } + ); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java index c86122141c8fe..b7de6c15459c9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayNotificationCountProviderTest.java @@ -61,7 +61,8 @@ public class DreamOverlayNotificationCountProviderTest extends SysuiTestCase { final StatusBarNotification[] notifications = {mNotification1}; when(mNotificationListener.getActiveNotifications()).thenReturn(notifications); - mProvider = new DreamOverlayNotificationCountProvider(mNotificationListener); + mProvider = new DreamOverlayNotificationCountProvider( + mNotificationListener, Runnable::run); mProvider.addCallback(mCallback); }