Hides low-priority icons from status bar.

This change modifies NotificationIconAreaController such that icons for
low-priority notifications are not shown.  This behavior is controlled
by a new switch in the SystemUI Tuner.

Test: manually
Bug: 116622974
Change-Id: I7f1d5b6c5757936aba93da3d0e50ae1dd8434b33
This commit is contained in:
Gus Prevas
2018-10-26 15:40:27 -04:00
parent 5740576716
commit 33619afa8b
4 changed files with 68 additions and 15 deletions

View File

@@ -1851,6 +1851,9 @@
<item>Don\'t show this icon</item>
</string-array>
<!-- SysUI Tuner: Switch for showing low-priority notification icons in status bar [CHAR LIMIT=NONE] -->
<string name="tuner_low_priority">Show low-priority notification icons</string>
<!-- SysUI Tuner: Other section -->
<string name="other">Other</string>

View File

@@ -98,6 +98,11 @@
android:summary="%s"
android:entries="@array/clock_options" />
<com.android.systemui.tuner.TunerSwitch
android:key="low_priority"
android:title="@string/tuner_low_priority"
sysui:defValue="false" />
</PreferenceScreen>
<PreferenceScreen

View File

@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification.stack;
import static com.android.systemui.statusbar.notification.ActivityLaunchAnimator
.ExpandAnimationParameters;
import static com.android.systemui.statusbar.phone.NotificationIconAreaController.LOW_PRIORITY;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -27,6 +28,7 @@ import android.animation.TimeAnimator;
import android.animation.ValueAnimator;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.NotificationManager;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.Intent;
@@ -127,6 +129,7 @@ import com.android.systemui.statusbar.policy.ConfigurationController;
import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener;
import com.android.systemui.statusbar.policy.HeadsUpUtil;
import com.android.systemui.statusbar.policy.ScrollAdapter;
import com.android.systemui.tuner.TunerService;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -159,6 +162,7 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
private int mCurrentStackHeight = Integer.MAX_VALUE;
private final Paint mBackgroundPaint = new Paint();
private final boolean mShouldDrawNotificationBackground;
private boolean mLowPriorityBeforeSpeedBump;
private float mExpandedHeight;
private int mOwnScrollY;
@@ -515,6 +519,13 @@ public class NotificationStackScrollLayout extends ViewGroup implements ScrollAd
mDebugPaint.setStyle(Paint.Style.STROKE);
}
mClearAllEnabled = res.getBoolean(R.bool.config_enableNotificationsClearAll);
TunerService tunerService = Dependency.get(TunerService.class);
tunerService.addTunable((key, newValue) -> {
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;
}
}

View File

@@ -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<NotificationData.Entry, StatusBarIconView> function,
NotificationIconContainer hostLayout, boolean showAmbient, boolean hideDismissed,
boolean hideRepliedMessages) {
NotificationIconContainer hostLayout, boolean showAmbient, boolean showLowPriority,
boolean hideDismissed, boolean hideRepliedMessages) {
ArrayList<StatusBarIconView> 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));
}