diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index b92fcc6c1d312..3e928a4227cd0 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1851,6 +1851,9 @@
- Don\'t show this icon
+
+ Show low-priority notification icons
+
Other
diff --git a/packages/SystemUI/res/xml/tuner_prefs.xml b/packages/SystemUI/res/xml/tuner_prefs.xml
index 46ea4949512bc..6eec5dc9e1c18 100644
--- a/packages/SystemUI/res/xml/tuner_prefs.xml
+++ b/packages/SystemUI/res/xml/tuner_prefs.xml
@@ -98,6 +98,11 @@
android:summary="%s"
android:entries="@array/clock_options" />
+
+
{
+ if (key.equals(LOW_PRIORITY)) {
+ mLowPriorityBeforeSpeedBump = "1".equals(newValue);
+ }
+ }, LOW_PRIORITY);
}
@Override
@@ -5087,8 +5098,16 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
}
ExpandableNotificationRow row = (ExpandableNotificationRow) view;
currentIndex++;
- if (!mEntryManager.getNotificationData().isAmbient(
- row.getStatusBarNotification().getKey())) {
+ boolean beforeSpeedBump;
+ if (mLowPriorityBeforeSpeedBump) {
+ beforeSpeedBump = !mEntryManager.getNotificationData().isAmbient(
+ row.getStatusBarNotification().getKey());
+ } else {
+ beforeSpeedBump = mEntryManager.getNotificationData().getImportance(
+ row.getStatusBarNotification().getKey())
+ >= NotificationManager.IMPORTANCE_DEFAULT;
+ }
+ if (beforeSpeedBump) {
speedBumpIndex = currentIndex;
}
}
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 21b98db11a361..5960b13e8e31d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -1,29 +1,31 @@
package com.android.systemui.statusbar.phone;
+import android.app.NotificationManager;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.Rect;
-import androidx.annotation.NonNull;
-import androidx.collection.ArrayMap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
+import androidx.annotation.NonNull;
+import androidx.collection.ArrayMap;
+
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.util.ContrastColorUtil;
import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
-import com.android.systemui.statusbar.notification.NotificationData;
-import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.NotificationShelf;
import com.android.systemui.statusbar.StatusBarIconView;
+import com.android.systemui.statusbar.notification.NotificationData;
+import com.android.systemui.statusbar.notification.NotificationEntryManager;
import com.android.systemui.statusbar.notification.NotificationUtils;
+import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
import com.android.systemui.statusbar.policy.DarkIconDispatcher;
import com.android.systemui.statusbar.policy.DarkIconDispatcher.DarkReceiver;
-import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout;
+import com.android.systemui.tuner.TunerService;
import java.util.ArrayList;
import java.util.function.Function;
@@ -33,9 +35,23 @@ import java.util.function.Function;
* normally reserved for notifications.
*/
public class NotificationIconAreaController implements DarkReceiver {
+
+ public static final String LOW_PRIORITY = "low_priority";
+
private final ContrastColorUtil mContrastColorUtil;
private final NotificationEntryManager mEntryManager;
private final Runnable mUpdateStatusBarIcons = this::updateStatusBarIcons;
+ private final TunerService.Tunable mTunable = new TunerService.Tunable() {
+ @Override
+ public void onTuningChanged(String key, String newValue) {
+ if (key.equals(LOW_PRIORITY)) {
+ mShowLowPriority = "1".equals(newValue);
+ if (mNotificationScrollLayout != null) {
+ updateStatusBarIcons();
+ }
+ }
+ }
+ };
private int mIconSize;
private int mIconHPadding;
@@ -49,6 +65,7 @@ public class NotificationIconAreaController implements DarkReceiver {
private ViewGroup mNotificationScrollLayout;
private Context mContext;
private boolean mFullyDark;
+ private boolean mShowLowPriority;
public NotificationIconAreaController(Context context, StatusBar statusBar) {
mStatusBar = statusBar;
@@ -56,6 +73,8 @@ public class NotificationIconAreaController implements DarkReceiver {
mContext = context;
mEntryManager = Dependency.get(NotificationEntryManager.class);
+ Dependency.get(TunerService.class).addTunable(mTunable, LOW_PRIORITY);
+
initializeNotificationAreaViews(context);
}
@@ -142,10 +161,16 @@ public class NotificationIconAreaController implements DarkReceiver {
}
protected boolean shouldShowNotificationIcon(NotificationData.Entry entry,
- boolean showAmbient, boolean hideDismissed, boolean hideRepliedMessages) {
+ boolean showAmbient, boolean showLowPriority, boolean hideDismissed,
+ boolean hideRepliedMessages) {
if (mEntryManager.getNotificationData().isAmbient(entry.key) && !showAmbient) {
return false;
}
+ if (!showLowPriority
+ && mEntryManager.getNotificationData().getImportance(entry.key)
+ < NotificationManager.IMPORTANCE_DEFAULT) {
+ return false;
+ }
if (!StatusBar.isTopLevelChild(entry)) {
return false;
}
@@ -181,13 +206,14 @@ public class NotificationIconAreaController implements DarkReceiver {
private void updateShelfIcons() {
updateIconsForLayout(entry -> entry.expandedIcon, mShelfIcons,
- NotificationShelf.SHOW_AMBIENT_ICONS, false /* hideDismissed */,
- mFullyDark /* hideRepliedMessages */);
+ NotificationShelf.SHOW_AMBIENT_ICONS, !mFullyDark /* showLowPriority */,
+ false /* hideDismissed */, mFullyDark /* hideRepliedMessages */);
}
public void updateStatusBarIcons() {
updateIconsForLayout(entry -> entry.icon, mNotificationIcons,
- false /* showAmbient */, true /* hideDismissed */, true /* hideRepliedMessages */);
+ false /* showAmbient */, false /* showLowPriority */, true /* hideDismissed */,
+ true /* hideRepliedMessages */);
}
/**
@@ -200,8 +226,8 @@ public class NotificationIconAreaController implements DarkReceiver {
* @param hideRepliedMessages should messages that have been replied to be hidden
*/
private void updateIconsForLayout(Function function,
- NotificationIconContainer hostLayout, boolean showAmbient, boolean hideDismissed,
- boolean hideRepliedMessages) {
+ NotificationIconContainer hostLayout, boolean showAmbient, boolean showLowPriority,
+ boolean hideDismissed, boolean hideRepliedMessages) {
ArrayList toShow = new ArrayList<>(
mNotificationScrollLayout.getChildCount());
@@ -210,7 +236,7 @@ public class NotificationIconAreaController implements DarkReceiver {
View view = mNotificationScrollLayout.getChildAt(i);
if (view instanceof ExpandableNotificationRow) {
NotificationData.Entry ent = ((ExpandableNotificationRow) view).getEntry();
- if (shouldShowNotificationIcon(ent, showAmbient, hideDismissed,
+ if (shouldShowNotificationIcon(ent, showAmbient, showLowPriority, hideDismissed,
hideRepliedMessages)) {
toShow.add(function.apply(ent));
}