Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 33619afa authored by Gus Prevas's avatar Gus Prevas
Browse files

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
parent 57405767
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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>

+5 −0
Original line number Diff line number Diff line
@@ -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
+21 −2
Original line number Diff line number Diff line
@@ -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;
            }
        }
+39 −13
Original line number Diff line number Diff line
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));
                }