diff options
| author | 2020-07-29 17:56:58 -0400 | |
|---|---|---|
| committer | 2020-07-31 15:57:54 +0000 | |
| commit | 70a648c8c0d146070c839b0a0870682c8658b65d (patch) | |
| tree | 1a04bbb2384ec017fd7a8f5278c5485fa6528380 | |
| parent | b8c40cdebefed3e8f5d2b578d4e2d0595b47bb4e (diff) | |
DO NOT MERGE Filter out suppressed notifications in entry manager
`NotificationEntryManager#hasActiveNotifications` used to be in 1:1
correspondence with the visible notifications in the shade, and as such
was suitable for code that needs to do things like calculate the height
of the shade. However if there is a bubble, it's still backed by a
notification but is suppressed from the shade.
This CL is unfortunately hacky because the API for
NotificationEntryManager doesn't have the concept of "a notification
which exists but is not in the shade" and therefore the correct fix
actually would involve creating the correct api and updating all call
sites with the correct semantics.
Test: manual
Bug: 161461739
Change-Id: I9b0fc0f48609b64371d3cb7677228b4bb1fa6aef
10 files changed, 50 insertions, 15 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java index 9abc66056452..d04389d6cbe8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java @@ -36,6 +36,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.Dumpable; +import com.android.systemui.bubbles.BubbleController; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.NotificationLifetimeExtender; import com.android.systemui.statusbar.NotificationListener; @@ -189,6 +190,8 @@ public class NotificationEntryManager implements } } + private final Lazy<BubbleController> mBubbleControllerLazy; + /** * Injected constructor. See {@link NotificationsModule}. */ @@ -201,6 +204,7 @@ public class NotificationEntryManager implements Lazy<NotificationRowBinder> notificationRowBinderLazy, Lazy<NotificationRemoteInputManager> notificationRemoteInputManagerLazy, LeakDetector leakDetector, + Lazy<BubbleController> bubbleController, ForegroundServiceDismissalFeatureController fgsFeatureController) { mLogger = logger; mGroupManager = groupManager; @@ -211,6 +215,7 @@ public class NotificationEntryManager implements mRemoteInputManagerLazy = notificationRemoteInputManagerLazy; mLeakDetector = leakDetector; mFgsFeatureController = fgsFeatureController; + mBubbleControllerLazy = bubbleController; } /** Once called, the NEM will start processing notification events from system server. */ @@ -920,8 +925,20 @@ public class NotificationEntryManager implements /** * @return {@code true} if there is at least one notification that should be visible right now */ - public boolean hasActiveNotifications() { - return mReadOnlyNotifications.size() != 0; + public boolean hasVisibleNotifications() { + if (mReadOnlyNotifications.size() == 0) { + return false; + } + + // Filter out suppressed notifications, which are active notifications backing a bubble + // but are not present in the shade + for (NotificationEntry e : mSortedAndFiltered) { + if (!mBubbleControllerLazy.get().isBubbleNotificationSuppressedFromShade(e)) { + return true; + } + } + + return false; } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java index df1de63b65a0..c37e93d4fcc5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java @@ -87,6 +87,7 @@ public interface NotificationsModule { Lazy<NotificationRowBinder> notificationRowBinderLazy, Lazy<NotificationRemoteInputManager> notificationRemoteInputManagerLazy, LeakDetector leakDetector, + Lazy<BubbleController> bubbleController, ForegroundServiceDismissalFeatureController fgsFeatureController) { return new NotificationEntryManager( logger, @@ -97,6 +98,7 @@ public interface NotificationsModule { notificationRowBinderLazy, notificationRemoteInputManagerLazy, leakDetector, + bubbleController, fgsFeatureController); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index b9d31a93f408..a4a58194a46b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -6580,7 +6580,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd if (mFeatureFlags.isNewNotifPipelineRenderingEnabled()) { return !mNotifPipeline.getShadeList().isEmpty(); } else { - return mEntryManager.hasActiveNotifications(); + return mEntryManager.hasVisibleNotifications(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java index 8e192c5bf17d..c758670fc457 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java @@ -97,7 +97,7 @@ public class LightsOutNotifController { } private boolean hasActiveNotifications() { - return mEntryManager.hasActiveNotifications(); + return mEntryManager.hasVisibleNotifications(); } @VisibleForTesting diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 375af6b099c2..64202d221b2d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -3003,7 +3003,7 @@ public class NotificationPanelViewController extends PanelViewController { private void updateShowEmptyShadeView() { boolean showEmptyShadeView = - mBarState != StatusBarState.KEYGUARD && !mEntryManager.hasActiveNotifications(); + mBarState != StatusBarState.KEYGUARD && !mEntryManager.hasVisibleNotifications(); showEmptyShadeView(showEmptyShadeView); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java index 45f0c49a4fd4..8e933a281b3b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationPresenter.java @@ -330,7 +330,7 @@ public class StatusBarNotificationPresenter implements NotificationPresenter, } public boolean hasActiveNotifications() { - return mEntryManager.hasActiveNotifications(); + return mEntryManager.hasVisibleNotifications(); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java index a5a5f81bdffe..90423c18216a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java @@ -61,6 +61,7 @@ import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.bubbles.BubbleController; import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.NotificationLifetimeExtender; import com.android.systemui.statusbar.NotificationMediaManager; @@ -98,6 +99,8 @@ import java.util.Collection; import java.util.List; import java.util.Set; +import dagger.Lazy; + /** * Unit tests for {@link NotificationEntryManager}. This test will not test any interactions with * inflation. Instead, for functional inflation tests, see @@ -126,6 +129,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase { @Mock private LeakDetector mLeakDetector; @Mock private NotificationMediaManager mNotificationMediaManager; @Mock private NotificationRowBinder mNotificationRowBinder; + @Mock private Lazy<BubbleController> mBubbleControllerLazy; private int mId; private NotificationEntry mEntry; @@ -200,6 +204,7 @@ public class NotificationEntryManagerTest extends SysuiTestCase { () -> mNotificationRowBinder, () -> mRemoteInputManager, mLeakDetector, + mBubbleControllerLazy, mock(ForegroundServiceDismissalFeatureController.class) ); mEntryManager.setUpWithPresenter(mPresenter); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java index 3ea0e5639c71..299dd0c92ff2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java @@ -43,6 +43,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.util.NotificationMessagingUtil; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.bubbles.BubbleController; import com.android.systemui.media.MediaFeatureFlag; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; @@ -95,6 +96,8 @@ import org.mockito.stubbing.Answer; import java.util.concurrent.CountDownLatch; +import dagger.Lazy; + /** * Functional tests for notification inflation from {@link NotificationEntryManager}. */ @@ -136,6 +139,8 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase { @Mock private NotificationRowComponent.Builder mNotificationRowComponentBuilder; @Mock private PeopleNotificationIdentifier mPeopleNotificationIdentifier; + @Mock private Lazy<BubbleController> mBubbleControllerLazy; + private StatusBarNotification mSbn; private NotificationListenerService.RankingMap mRankingMap; private NotificationEntryManager mEntryManager; @@ -183,6 +188,7 @@ public class NotificationEntryManagerInflationTest extends SysuiTestCase { () -> mRowBinder, () -> mRemoteInputManager, mLeakDetector, + mBubbleControllerLazy, mock(ForegroundServiceDismissalFeatureController.class) ); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index b286f9486e13..2ae4caeca963 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -52,6 +52,7 @@ import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.ExpandHelper; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.bubbles.BubbleController; import com.android.systemui.classifier.FalsingManagerFake; import com.android.systemui.media.KeyguardMediaController; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; @@ -109,6 +110,8 @@ import org.mockito.junit.MockitoRule; import java.util.ArrayList; import java.util.List; +import dagger.Lazy; + /** * Tests for {@link NotificationStackScrollLayout}. */ @@ -140,6 +143,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { @Mock private NotificationSection mNotificationSection; @Mock private NotificationLockscreenUserManager mLockscreenUserManager; @Mock private FeatureFlags mFeatureFlags; + @Mock private Lazy<BubbleController> mBubbleControllerLazy; private UserChangedListener mUserChangedListener; private NotificationEntryManager mEntryManager; private int mOriginalInterruptionModelSetting; @@ -190,6 +194,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { () -> mock(NotificationRowBinder.class), () -> mRemoteInputManager, mock(LeakDetector.class), + mBubbleControllerLazy, mock(ForegroundServiceDismissalFeatureController.class) ); mEntryManager.setUpWithPresenter(mock(NotificationPresenter.class)); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java index dbb451277535..9d81a90e7af1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java @@ -130,7 +130,7 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { @Test public void testLightsOut_withNotifs_onSystemBarAppearanceChanged() { // GIVEN active visible notifications - when(mEntryManager.hasActiveNotifications()).thenReturn(true); + when(mEntryManager.hasVisibleNotifications()).thenReturn(true); // WHEN lights out mCallbacks.onSystemBarAppearanceChanged( @@ -147,7 +147,7 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { @Test public void testLightsOut_withoutNotifs_onSystemBarAppearanceChanged() { // GIVEN no active visible notifications - when(mEntryManager.hasActiveNotifications()).thenReturn(false); + when(mEntryManager.hasVisibleNotifications()).thenReturn(false); // WHEN lights out mCallbacks.onSystemBarAppearanceChanged( @@ -164,7 +164,7 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { @Test public void testLightsOn_afterLightsOut_onSystemBarAppearanceChanged() { // GIVEN active visible notifications - when(mEntryManager.hasActiveNotifications()).thenReturn(true); + when(mEntryManager.hasVisibleNotifications()).thenReturn(true); // WHEN lights on mCallbacks.onSystemBarAppearanceChanged( @@ -181,13 +181,13 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { @Test public void testEntryAdded() { // GIVEN no visible notifications and lights out - when(mEntryManager.hasActiveNotifications()).thenReturn(false); + when(mEntryManager.hasVisibleNotifications()).thenReturn(false); mLightsOutNotifController.mAppearance = LIGHTS_OUT; mLightsOutNotifController.updateLightsOutView(); assertIsShowingDot(false); // WHEN an active notification is added - when(mEntryManager.hasActiveNotifications()).thenReturn(true); + when(mEntryManager.hasVisibleNotifications()).thenReturn(true); assertTrue(mLightsOutNotifController.shouldShowDot()); mEntryListener.onNotificationAdded(mock(NotificationEntry.class)); @@ -198,13 +198,13 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { @Test public void testEntryRemoved() { // GIVEN a visible notification and lights out - when(mEntryManager.hasActiveNotifications()).thenReturn(true); + when(mEntryManager.hasVisibleNotifications()).thenReturn(true); mLightsOutNotifController.mAppearance = LIGHTS_OUT; mLightsOutNotifController.updateLightsOutView(); assertIsShowingDot(true); // WHEN all active notifications are removed - when(mEntryManager.hasActiveNotifications()).thenReturn(false); + when(mEntryManager.hasVisibleNotifications()).thenReturn(false); assertFalse(mLightsOutNotifController.shouldShowDot()); mEntryListener.onEntryRemoved( mock(NotificationEntry.class), null, false, REASON_CANCEL_ALL); @@ -216,13 +216,13 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { @Test public void testEntryUpdated() { // GIVEN no visible notifications and lights out - when(mEntryManager.hasActiveNotifications()).thenReturn(false); + when(mEntryManager.hasVisibleNotifications()).thenReturn(false); mLightsOutNotifController.mAppearance = LIGHTS_OUT; mLightsOutNotifController.updateLightsOutView(); assertIsShowingDot(false); // WHEN an active notification is added - when(mEntryManager.hasActiveNotifications()).thenReturn(true); + when(mEntryManager.hasVisibleNotifications()).thenReturn(true); assertTrue(mLightsOutNotifController.shouldShowDot()); mEntryListener.onPostEntryUpdated(mock(NotificationEntry.class)); |