Clean up NotificationIconAreaController.shouldShowNotificationIcon() for new pipeline

In the new pipeline:
* rows are never GONE.
* the List<ListEntry> is hierarchical, so isTopLevelChild() is redundant.
* "low priority" and "ambient" map to "silent section" and "minimized", so use the pipeline-assigned section to perform the filtering.

Understanding the pipeline-assigned section's type required adding the "silent" section classifications to the SectionStyleProvider.

isTopLevelChild() is now unused, so it has been removed.  Yay!

Fixes: 237296171
Test: atest NotificationIconAreaControllerTest
Change-Id: I8c4b0435fdb43be2b0f99728ef8fbc8733ea1c43
This commit is contained in:
Jeff DeCew
2023-02-22 21:15:08 +00:00
parent d9d6622fd5
commit a3c5d00030
6 changed files with 50 additions and 27 deletions

View File

@@ -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();
}

View File

@@ -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);

View File

@@ -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<NotifSectioner>
private lateinit var lowPrioritySections: Set<NotifSectioner>
/**
@@ -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<NotifSectioner>) {
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)
}
}

View File

@@ -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;
}

View File

@@ -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<Bubbles> 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<Bubbles> 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) {

View File

@@ -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,