diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 4e9e88d572014..bc531da0ec402 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -619,14 +619,6 @@ public final class NotificationEntry extends ListEntry { return row.isMediaRow(); } - /** - * We are a top level child if our parent is the list of notifications duh - * @return {@code true} if we're a top level notification - */ - public boolean isTopLevelChild() { - return row != null && row.isTopLevelChild(); - } - public void resetUserExpansion() { if (row != null) row.resetUserExpansion(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java index 67a8a63ad7dae..6c84fefe2d38d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinator.java @@ -34,6 +34,7 @@ import com.android.systemui.statusbar.notification.dagger.AlertingHeader; import com.android.systemui.statusbar.notification.dagger.SilentHeader; import com.android.systemui.statusbar.notification.stack.NotificationPriorityBucketKt; +import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -43,8 +44,8 @@ import javax.inject.Inject; * Filters out NotificationEntries based on its Ranking and dozing state. * Assigns alerting / silent section based on the importance of the notification entry. * We check the NotificationEntry's Ranking for: - * - whether the notification's app is suspended or hiding its notifications - * - whether DND settings are hiding notifications from ambient display or the notification list + * - whether the notification's app is suspended or hiding its notifications + * - whether DND settings are hiding notifications from ambient display or the notification list */ @CoordinatorScope public class RankingCoordinator implements Coordinator { @@ -78,6 +79,8 @@ public class RankingCoordinator implements Coordinator { public void attach(NotifPipeline pipeline) { mStatusBarStateController.addCallback(mStatusBarStateCallback); mSectionStyleProvider.setMinimizedSections(Collections.singleton(mMinimizedNotifSectioner)); + mSectionStyleProvider.setSilentSections( + Arrays.asList(mSilentNotifSectioner, mMinimizedNotifSectioner)); pipeline.addPreGroupFilter(mSuspendedFilter); pipeline.addPreGroupFilter(mDndVisualEffectsFilter); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt index 7b9483022fd80..5a3edf4ac8fd3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/provider/SectionStyleProvider.kt @@ -17,6 +17,7 @@ package com.android.systemui.statusbar.notification.collection.provider import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.statusbar.notification.collection.ListEntry import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner import javax.inject.Inject @@ -27,6 +28,7 @@ import javax.inject.Inject */ @SysUISingleton class SectionStyleProvider @Inject constructor() { + private lateinit var silentSections: Set private lateinit var lowPrioritySections: Set /** @@ -38,9 +40,42 @@ class SectionStyleProvider @Inject constructor() { } /** - * Determine if the given section is minimized + * Determine if the given section is minimized. */ fun isMinimizedSection(section: NotifSection): Boolean { return lowPrioritySections.contains(section.sectioner) } + + /** + * Determine if the given entry is minimized. + */ + @JvmOverloads + fun isMinimized(entry: ListEntry, ifNotInSection: Boolean = true): Boolean { + val section = entry.section ?: return ifNotInSection + return isMinimizedSection(section) + } + + /** + * Feed the provider the information it needs about which sections are silent, so that it can + * calculate which entries are in a "silent" section. + */ + fun setSilentSections(sections: Collection) { + silentSections = sections.toSet() + } + + /** + * Determine if the given section is silent. + */ + fun isSilentSection(section: NotifSection): Boolean { + return silentSections.contains(section.sectioner) + } + + /** + * Determine if the given entry is silent. + */ + @JvmOverloads + fun isSilent(entry: ListEntry, ifNotInSection: Boolean = true): Boolean { + val section = entry.section ?: return ifNotInSection + return isSilentSection(section) + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 7c6efe47eafcd..1c91b9f248731 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -110,7 +110,6 @@ import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.notification.stack.ExpandableViewState; import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer; -import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.SwipeableView; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.policy.HeadsUpManager; @@ -3587,10 +3586,6 @@ public class ExpandableNotificationRow extends ActivatableNotificationView return mEntry.getSbn().getNotification().isMediaNotification(); } - public boolean isTopLevelChild() { - return getParent() instanceof NotificationStackScrollLayout; - } - public boolean isGroupNotFullyVisible() { return getClipTopAmount() > 0 || getTranslationY() < 0; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 85590fc0b64ff..eb19c0d2ad71e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -1,6 +1,5 @@ package com.android.systemui.statusbar.phone; -import android.app.NotificationManager; import android.content.Context; import android.content.res.Resources; import android.graphics.Color; @@ -39,6 +38,7 @@ import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator import com.android.systemui.statusbar.notification.PropertyAnimator; import com.android.systemui.statusbar.notification.collection.ListEntry; import com.android.systemui.statusbar.notification.collection.NotificationEntry; +import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider; import com.android.systemui.statusbar.notification.stack.AnimationProperties; import com.android.systemui.statusbar.window.StatusBarWindowController; import com.android.wm.shell.bubbles.Bubbles; @@ -73,6 +73,7 @@ public class NotificationIconAreaController implements private final NotificationWakeUpCoordinator mWakeUpCoordinator; private final KeyguardBypassController mBypassController; private final DozeParameters mDozeParameters; + private final SectionStyleProvider mSectionStyleProvider; private final Optional mBubblesOptional; private final StatusBarWindowController mStatusBarWindowController; private final ScreenOffAnimationController mScreenOffAnimationController; @@ -117,6 +118,7 @@ public class NotificationIconAreaController implements NotificationMediaManager notificationMediaManager, NotificationListener notificationListener, DozeParameters dozeParameters, + SectionStyleProvider sectionStyleProvider, Optional bubblesOptional, DemoModeController demoModeController, DarkIconDispatcher darkIconDispatcher, @@ -128,6 +130,7 @@ public class NotificationIconAreaController implements mStatusBarStateController.addCallback(this); mMediaManager = notificationMediaManager; mDozeParameters = dozeParameters; + mSectionStyleProvider = sectionStyleProvider; mWakeUpCoordinator = wakeUpCoordinator; wakeUpCoordinator.addListener(this); mBypassController = keyguardBypassController; @@ -260,19 +263,13 @@ public class NotificationIconAreaController implements protected boolean shouldShowNotificationIcon(NotificationEntry entry, boolean showAmbient, boolean showLowPriority, boolean hideDismissed, boolean hideRepliedMessages, boolean hideCurrentMedia, boolean hidePulsing) { - if (entry.getRanking().isAmbient() && !showAmbient) { + if (!showAmbient && mSectionStyleProvider.isMinimized(entry)) { return false; } if (hideCurrentMedia && entry.getKey().equals(mMediaManager.getMediaNotificationKey())) { return false; } - if (!showLowPriority && entry.getImportance() < NotificationManager.IMPORTANCE_DEFAULT) { - return false; - } - if (!entry.isTopLevelChild()) { - return false; - } - if (entry.getRow().getVisibility() == View.GONE) { + if (!showLowPriority && mSectionStyleProvider.isSilent(entry)) { return false; } if (entry.isRowDismissed() && hideDismissed) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java index 1582cee365d55..7d9c0913e15a4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationIconAreaControllerTest.java @@ -32,7 +32,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.NotificationListener; import com.android.systemui.statusbar.NotificationMediaManager; import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator; -import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; +import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider; import com.android.systemui.statusbar.window.StatusBarWindowController; import com.android.wm.shell.bubbles.Bubbles; @@ -62,7 +62,7 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase { @Mock DozeParameters mDozeParameters; @Mock - CommonNotifCollection mNotifCollection; + SectionStyleProvider mSectionStyleProvider; @Mock DarkIconDispatcher mDarkIconDispatcher; @Mock @@ -87,6 +87,7 @@ public class NotificationIconAreaControllerTest extends SysuiTestCase { mNotificationMediaManager, mListener, mDozeParameters, + mSectionStyleProvider, Optional.of(mBubbles), mDemoModeController, mDarkIconDispatcher,