diff --git a/packages/SystemUI/res/layout/status_bar_no_notifications.xml b/packages/SystemUI/res/layout/status_bar_no_notifications.xml index a2abdb2116022..856ba92b6d413 100644 --- a/packages/SystemUI/res/layout/status_bar_no_notifications.xml +++ b/packages/SystemUI/res/layout/status_bar_no_notifications.xml @@ -21,12 +21,29 @@ android:layout_height="wrap_content" android:visibility="gone" > - + > + + + diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index f223eb7edaf79..22a8f3443de25 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -403,6 +403,8 @@ (quick_qs_offset_height (60dp) - ongoing_appops_chip_height (24dp) ) / 2 --> 18dp + 16dp + 40dp diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 3e7b0f146b392..eb1c0efa24ec3 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1047,6 +1047,12 @@ No notifications + + No new notifications + + + Unlock to see older notifications + This device is managed by your parent diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java b/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java index 3d161d9bfa750..24c66eb5d442c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/EmptyShadeView.java @@ -17,9 +17,12 @@ package com.android.systemui.statusbar; import android.annotation.ColorInt; +import android.annotation.DrawableRes; import android.annotation.StringRes; import android.content.Context; +import android.content.res.ColorStateList; import android.content.res.Configuration; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.View; import android.widget.TextView; @@ -33,16 +36,30 @@ import com.android.systemui.statusbar.notification.stack.ExpandableViewState; public class EmptyShadeView extends StackScrollerDecorView { private TextView mEmptyText; + private TextView mEmptyFooterText; + private @StringRes int mText = R.string.empty_shade_text; + private @DrawableRes int mFooterIcon = R.drawable.ic_friction_lock_closed; + private @StringRes int mFooterText = R.string.unlock_to_see_notif_text; + private @Visibility int mFooterVisibility = View.GONE; + private int mSize; + public EmptyShadeView(Context context, AttributeSet attrs) { super(context, attrs); + mSize = getResources().getDimensionPixelSize( + R.dimen.notifications_unseen_footer_icon_size); } @Override protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); + mSize = getResources().getDimensionPixelSize( + R.dimen.notifications_unseen_footer_icon_size); mEmptyText.setText(mText); + mEmptyFooterText.setVisibility(mFooterVisibility); + setFooterText(mFooterText); + setFooterIcon(mFooterIcon); } @Override @@ -52,11 +69,13 @@ public class EmptyShadeView extends StackScrollerDecorView { @Override protected View findSecondaryView() { - return null; + return findViewById(R.id.no_notifications_footer); } public void setTextColor(@ColorInt int color) { mEmptyText.setTextColor(color); + mEmptyFooterText.setTextColor(color); + mEmptyFooterText.setCompoundDrawableTintList(ColorStateList.valueOf(color)); } public void setText(@StringRes int text) { @@ -64,14 +83,53 @@ public class EmptyShadeView extends StackScrollerDecorView { mEmptyText.setText(mText); } + public void setFooterVisibility(@Visibility int visibility) { + mFooterVisibility = visibility; + setSecondaryVisible(visibility == View.VISIBLE, false); + } + + public void setFooterText(@StringRes int text) { + mFooterText = text; + if (text != 0) { + mEmptyFooterText.setText(mFooterText); + } else { + mEmptyFooterText.setText(null); + } + } + + public void setFooterIcon(@DrawableRes int icon) { + mFooterIcon = icon; + Drawable drawable; + if (icon == 0) { + drawable = null; + } else { + drawable = getResources().getDrawable(icon); + drawable.setBounds(0, 0, mSize, mSize); + } + mEmptyFooterText.setCompoundDrawablesRelative(drawable, null, null, null); + } + + @StringRes public int getTextResource() { return mText; } + @StringRes + public int getFooterTextResource() { + return mFooterText; + } + + @DrawableRes + public int getFooterIconResource() { + return mFooterIcon; + } + @Override protected void onFinishInflate() { super.onFinishInflate(); mEmptyText = (TextView) findContentView(); + mEmptyFooterText = (TextView) findSecondaryView(); + mEmptyFooterText.setCompoundDrawableTintList(mEmptyFooterText.getTextColors()); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt index 6e5fcebf780f6..9da94ce968c7e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinator.kt @@ -28,6 +28,7 @@ import com.android.systemui.statusbar.notification.collection.coordinator.dagger import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener import com.android.systemui.statusbar.notification.collection.provider.SectionHeaderVisibilityProvider +import com.android.systemui.statusbar.notification.collection.provider.SeenNotificationsProviderImpl import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider import javax.inject.Inject import kotlin.time.Duration.Companion.seconds @@ -49,6 +50,7 @@ constructor( private val notifPipelineFlags: NotifPipelineFlags, @Application private val scope: CoroutineScope, private val sectionHeaderVisibilityProvider: SectionHeaderVisibilityProvider, + private val seenNotifsProvider: SeenNotificationsProviderImpl, private val statusBarStateController: StatusBarStateController, ) : Coordinator { @@ -105,6 +107,9 @@ constructor( @VisibleForTesting internal val unseenNotifFilter = object : NotifFilter("$TAG-unseen") { + + var hasFilteredAnyNotifs = false + override fun shouldFilterOut(entry: NotificationEntry, now: Long): Boolean = when { // Don't apply filter if the keyguard isn't currently showing @@ -115,7 +120,12 @@ constructor( // - summary will be pruned if necessary, depending on if children are filtered entry.parent?.summary == entry -> false else -> true - } + }.also { hasFiltered -> hasFilteredAnyNotifs = hasFilteredAnyNotifs || hasFiltered } + + override fun onCleanup() { + seenNotifsProvider.hasFilteredOutSeenNotifications = hasFilteredAnyNotifs + hasFilteredAnyNotifs = false + } } private val notifFilter: NotifFilter = diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SeenNotificationsProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SeenNotificationsProvider.kt new file mode 100644 index 0000000000000..cff47e2202991 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SeenNotificationsProvider.kt @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.notification.collection.provider + +import com.android.systemui.dagger.SysUISingleton +import dagger.Binds +import dagger.Module +import javax.inject.Inject + +/** Keeps track of whether "seen" notification content has been filtered out of the shade. */ +interface SeenNotificationsProvider { + /** Are any already-seen notifications currently filtered out of the shade? */ + val hasFilteredOutSeenNotifications: Boolean +} + +@Module +interface SeenNotificationsProviderModule { + @Binds + fun bindSeenNotificationsProvider( + impl: SeenNotificationsProviderImpl + ): SeenNotificationsProvider +} + +@SysUISingleton +class SeenNotificationsProviderImpl @Inject constructor() : SeenNotificationsProvider { + override var hasFilteredOutSeenNotifications: Boolean = false +} 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 a7b7a239f4c29..808638a99dfab 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 @@ -52,6 +52,7 @@ import com.android.systemui.statusbar.notification.collection.inflation.OnUserIn import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider; import com.android.systemui.statusbar.notification.collection.provider.NotificationVisibilityProviderImpl; +import com.android.systemui.statusbar.notification.collection.provider.SeenNotificationsProviderModule; import com.android.systemui.statusbar.notification.collection.provider.VisibilityLocationProviderDelegator; import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager; import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManagerImpl; @@ -96,6 +97,7 @@ import dagger.Provides; @Module(includes = { CoordinatorsModule.class, KeyguardNotificationVisibilityProviderModule.class, + SeenNotificationsProviderModule.class, ShadeEventsModule.class, NotifPipelineChoreographerModule.class, NotificationSectionHeadersModule.class, 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 073bd4bf302be..c62eb6dd7f6d1 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 @@ -32,10 +32,12 @@ import android.animation.AnimatorListenerAdapter; import android.animation.TimeAnimator; import android.animation.ValueAnimator; import android.annotation.ColorInt; +import android.annotation.DrawableRes; import android.annotation.FloatRange; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.StringRes; import android.content.Context; import android.content.Intent; import android.content.res.Configuration; @@ -4567,7 +4569,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - void setEmptyShadeView(EmptyShadeView emptyShadeView) { + public void setEmptyShadeView(EmptyShadeView emptyShadeView) { int index = -1; if (mEmptyShadeView != null) { index = indexOfChild(mEmptyShadeView); @@ -4578,15 +4580,43 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable } @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) - void updateEmptyShadeView(boolean visible, boolean areNotificationsHiddenInShade) { + void updateEmptyShadeView( + boolean visible, boolean areNotificationsHiddenInShade, boolean areSeenNotifsFiltered) { mEmptyShadeView.setVisible(visible, mIsExpanded && mAnimationsEnabled); + if (areNotificationsHiddenInShade) { + updateEmptyShadeView(R.string.dnd_suppressing_shade_text, 0, 0); + } else if (areSeenNotifsFiltered) { + updateEmptyShadeView( + R.string.no_unseen_notif_text, + R.string.unlock_to_see_notif_text, + R.drawable.ic_friction_lock_closed); + } else { + updateEmptyShadeView(R.string.empty_shade_text, 0, 0); + } + } + + private void updateEmptyShadeView( + @StringRes int newTextRes, + @StringRes int newFooterTextRes, + @DrawableRes int newFooterIconRes) { int oldTextRes = mEmptyShadeView.getTextResource(); - int newTextRes = areNotificationsHiddenInShade - ? R.string.dnd_suppressing_shade_text : R.string.empty_shade_text; if (oldTextRes != newTextRes) { mEmptyShadeView.setText(newTextRes); } + int oldFooterTextRes = mEmptyShadeView.getFooterTextResource(); + if (oldFooterTextRes != newFooterTextRes) { + mEmptyShadeView.setFooterText(newFooterTextRes); + } + int oldFooterIconRes = mEmptyShadeView.getFooterIconResource(); + if (oldFooterIconRes != newFooterIconRes) { + mEmptyShadeView.setFooterIcon(newFooterIconRes); + } + if (newFooterIconRes != 0 || newFooterTextRes != 0) { + mEmptyShadeView.setFooterVisibility(View.VISIBLE); + } else { + mEmptyShadeView.setFooterVisibility(View.GONE); + } } public boolean isEmptyShadeViewVisible() { @@ -5358,9 +5388,9 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable @ShadeViewRefactor(RefactorComponent.SHADE_VIEW) private void inflateEmptyShadeView() { + EmptyShadeView oldView = mEmptyShadeView; EmptyShadeView view = (EmptyShadeView) LayoutInflater.from(mContext).inflate( R.layout.status_bar_no_notifications, this, false); - view.setText(R.string.empty_shade_text); view.setOnClickListener(v -> { final boolean showHistory = mController.isHistoryEnabled(); Intent intent = showHistory @@ -5369,6 +5399,10 @@ public class NotificationStackScrollLayout extends ViewGroup implements Dumpable mCentralSurfaces.startActivity(intent, true, true, Intent.FLAG_ACTIVITY_SINGLE_TOP); }); setEmptyShadeView(view); + updateEmptyShadeView( + oldView == null ? R.string.empty_shade_text : oldView.getTextResource(), + oldView == null ? 0 : oldView.getFooterTextResource(), + oldView == null ? 0 : oldView.getFooterIconResource()); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java index ad4501a75ebbc..e3336b269ca10 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutController.java @@ -81,6 +81,7 @@ import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.DynamicPrivacyController; import com.android.systemui.statusbar.notification.LaunchAnimationParameters; +import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.NotificationActivityStarter; import com.android.systemui.statusbar.notification.collection.NotifCollection; import com.android.systemui.statusbar.notification.collection.NotifPipeline; @@ -89,6 +90,7 @@ import com.android.systemui.statusbar.notification.collection.PipelineDumpable; import com.android.systemui.statusbar.notification.collection.PipelineDumper; import com.android.systemui.statusbar.notification.collection.notifcollection.DismissedByUserStats; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener; +import com.android.systemui.statusbar.notification.collection.provider.SeenNotificationsProvider; import com.android.systemui.statusbar.notification.collection.provider.VisibilityLocationProviderDelegator; import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager; import com.android.systemui.statusbar.notification.collection.render.NotifStackController; @@ -174,6 +176,8 @@ public class NotificationStackScrollLayoutController { private final StackStateLogger mStackStateLogger; private final NotificationStackScrollLogger mLogger; private final GroupExpansionManager mGroupExpansionManager; + private final NotifPipelineFlags mNotifPipelineFlags; + private final SeenNotificationsProvider mSeenNotificationsProvider; private NotificationStackScrollLayout mView; private boolean mFadeNotificationsOnDismiss; @@ -639,12 +643,14 @@ public class NotificationStackScrollLayoutController { GroupExpansionManager groupManager, @SilentHeader SectionHeaderController silentHeaderController, NotifPipeline notifPipeline, + NotifPipelineFlags notifPipelineFlags, NotifCollection notifCollection, LockscreenShadeTransitionController lockscreenShadeTransitionController, ShadeTransitionController shadeTransitionController, UiEventLogger uiEventLogger, NotificationRemoteInputManager remoteInputManager, VisibilityLocationProviderDelegator visibilityLocationProviderDelegator, + SeenNotificationsProvider seenNotificationsProvider, ShadeController shadeController, InteractionJankMonitor jankMonitor, StackStateLogger stackLogger, @@ -683,10 +689,12 @@ public class NotificationStackScrollLayoutController { mGroupExpansionManager = groupManager; mSilentHeaderController = silentHeaderController; mNotifPipeline = notifPipeline; + mNotifPipelineFlags = notifPipelineFlags; mNotifCollection = notifCollection; mUiEventLogger = uiEventLogger; mRemoteInputManager = remoteInputManager; mVisibilityLocationProviderDelegator = visibilityLocationProviderDelegator; + mSeenNotificationsProvider = seenNotificationsProvider; mShadeController = shadeController; mFeatureFlags = featureFlags; mNotificationTargetsHelper = notificationTargetsHelper; @@ -1212,7 +1220,11 @@ public class NotificationStackScrollLayoutController { // For more details, see: b/228790482 && !isInTransitionToKeyguard(); - mView.updateEmptyShadeView(shouldShow, mZenModeController.areNotificationsHiddenInShade()); + mView.updateEmptyShadeView( + shouldShow, + mZenModeController.areNotificationsHiddenInShade(), + mNotifPipelineFlags.getShouldFilterUnseenNotifsOnKeyguard() + && mSeenNotificationsProvider.getHasFilteredOutSeenNotifications()); Trace.endSection(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.kt index bdedd244abfa5..7f73856bff896 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.kt @@ -30,6 +30,8 @@ import com.android.systemui.statusbar.notification.collection.NotificationEntryB import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener import com.android.systemui.statusbar.notification.collection.provider.SectionHeaderVisibilityProvider +import com.android.systemui.statusbar.notification.collection.provider.SeenNotificationsProvider +import com.android.systemui.statusbar.notification.collection.provider.SeenNotificationsProviderImpl import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProvider import com.android.systemui.util.mockito.eq import com.android.systemui.util.mockito.mock @@ -102,6 +104,31 @@ class KeyguardCoordinatorTest : SysuiTestCase() { } } + @Test + fun unseenFilterUpdatesSeenProviderWhenSuppressing() { + whenever(notifPipelineFlags.shouldFilterUnseenNotifsOnKeyguard).thenReturn(true) + + // GIVEN: Keyguard is not showing, and a notification is present + keyguardRepository.setKeyguardShowing(false) + runKeyguardCoordinatorTest { + val fakeEntry = NotificationEntryBuilder().build() + collectionListener.onEntryAdded(fakeEntry) + + // WHEN: The keyguard is now showing + keyguardRepository.setKeyguardShowing(true) + testScheduler.runCurrent() + + // THEN: The notification is recognized as "seen" and is filtered out. + assertThat(unseenFilter.shouldFilterOut(fakeEntry, 0L)).isTrue() + + // WHEN: The filter is cleaned up + unseenFilter.onCleanup() + + // THEN: The SeenNotificationProvider has been updated to reflect the suppression + assertThat(seenNotificationsProvider.hasFilteredOutSeenNotifications).isTrue() + } + } + @Test fun unseenFilterAllowsNewNotif() { whenever(notifPipelineFlags.shouldFilterUnseenNotifsOnKeyguard).thenReturn(true) @@ -204,6 +231,7 @@ class KeyguardCoordinatorTest : SysuiTestCase() { testBlock: suspend KeyguardCoordinatorTestScope.() -> Unit ) { val testScope = TestScope(UnconfinedTestDispatcher()) + val seenNotificationsProvider = SeenNotificationsProviderImpl() val keyguardCoordinator = KeyguardCoordinator( keyguardNotifVisibilityProvider, @@ -211,18 +239,20 @@ class KeyguardCoordinatorTest : SysuiTestCase() { notifPipelineFlags, testScope.backgroundScope, sectionHeaderVisibilityProvider, + seenNotificationsProvider, statusBarStateController, ) keyguardCoordinator.attach(notifPipeline) - KeyguardCoordinatorTestScope(keyguardCoordinator, testScope).run { - testScheduler.advanceUntilIdle() - testScope.runTest(dispatchTimeoutMs = 1.seconds.inWholeMilliseconds) { testBlock() } + testScope.runTest(dispatchTimeoutMs = 1.seconds.inWholeMilliseconds) { + KeyguardCoordinatorTestScope(keyguardCoordinator, testScope, seenNotificationsProvider) + .testBlock() } } private inner class KeyguardCoordinatorTestScope( private val keyguardCoordinator: KeyguardCoordinator, private val scope: TestScope, + val seenNotificationsProvider: SeenNotificationsProvider, ) : CoroutineScope by scope { val testScheduler: TestCoroutineScheduler get() = scope.testScheduler diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java index 026c82eda42d4..645052feee946 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java @@ -59,8 +59,10 @@ import com.android.systemui.statusbar.NotificationRemoteInputManager; import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.notification.DynamicPrivacyController; +import com.android.systemui.statusbar.notification.NotifPipelineFlags; import com.android.systemui.statusbar.notification.collection.NotifCollection; import com.android.systemui.statusbar.notification.collection.NotifPipeline; +import com.android.systemui.statusbar.notification.collection.provider.SeenNotificationsProviderImpl; import com.android.systemui.statusbar.notification.collection.provider.VisibilityLocationProviderDelegator; import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager; import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; @@ -119,6 +121,7 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { @Mock private GroupExpansionManager mGroupExpansionManager; @Mock private SectionHeaderController mSilentHeaderController; @Mock private NotifPipeline mNotifPipeline; + @Mock private NotifPipelineFlags mNotifPipelineFlags; @Mock private NotifCollection mNotifCollection; @Mock private UiEventLogger mUiEventLogger; @Mock private LockscreenShadeTransitionController mLockscreenShadeTransitionController; @@ -170,12 +173,14 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mGroupExpansionManager, mSilentHeaderController, mNotifPipeline, + mNotifPipelineFlags, mNotifCollection, mLockscreenShadeTransitionController, mShadeTransitionController, mUiEventLogger, mRemoteInputManager, mVisibilityLocationProviderDelegator, + new SeenNotificationsProviderImpl(), mShadeController, mJankMonitor, mStackLogger, @@ -228,14 +233,16 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( /* visible= */ true, - /* notifVisibleInShade= */ true); + /* notifVisibleInShade= */ true, + /* areSeenNotifsFiltered= */false); setupShowEmptyShadeViewState(false); reset(mNotificationStackScrollLayout); mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( /* visible= */ false, - /* notifVisibleInShade= */ true); + /* notifVisibleInShade= */ true, + /* areSeenNotifsFiltered= */false); } @Test @@ -248,14 +255,16 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( /* visible= */ true, - /* notifVisibleInShade= */ false); + /* notifVisibleInShade= */ false, + /* areSeenNotifsFiltered= */false); setupShowEmptyShadeViewState(false); reset(mNotificationStackScrollLayout); mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( /* visible= */ false, - /* notifVisibleInShade= */ false); + /* notifVisibleInShade= */ false, + /* areSeenNotifsFiltered= */false); } @Test @@ -274,14 +283,16 @@ public class NotificationStackScrollLayoutControllerTest extends SysuiTestCase { mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( /* visible= */ true, - /* notifVisibleInShade= */ false); + /* notifVisibleInShade= */ false, + /* areSeenNotifsFiltered= */false); mController.setQsFullScreen(true); reset(mNotificationStackScrollLayout); mController.updateShowEmptyShadeView(); verify(mNotificationStackScrollLayout).updateEmptyShadeView( /* visible= */ true, - /* notifVisibleInShade= */ false); + /* notifVisibleInShade= */ false, + /* areSeenNotifsFiltered= */false); } @Test 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 dceb4ff48125d..07ea6304f7cd3 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 @@ -324,7 +324,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { public void updateEmptyView_dndSuppressing() { when(mEmptyShadeView.willBeGone()).thenReturn(true); - mStackScroller.updateEmptyShadeView(true, true); + mStackScroller.updateEmptyShadeView(true, true, false); verify(mEmptyShadeView).setText(R.string.dnd_suppressing_shade_text); } @@ -334,7 +334,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { mStackScroller.setEmptyShadeView(mEmptyShadeView); when(mEmptyShadeView.willBeGone()).thenReturn(true); - mStackScroller.updateEmptyShadeView(true, false); + mStackScroller.updateEmptyShadeView(true, false, false); verify(mEmptyShadeView).setText(R.string.empty_shade_text); } @@ -343,10 +343,10 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { public void updateEmptyView_noNotificationsToDndSuppressing() { mStackScroller.setEmptyShadeView(mEmptyShadeView); when(mEmptyShadeView.willBeGone()).thenReturn(true); - mStackScroller.updateEmptyShadeView(true, false); + mStackScroller.updateEmptyShadeView(true, false, false); verify(mEmptyShadeView).setText(R.string.empty_shade_text); - mStackScroller.updateEmptyShadeView(true, true); + mStackScroller.updateEmptyShadeView(true, true, false); verify(mEmptyShadeView).setText(R.string.dnd_suppressing_shade_text); }