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

Commit 740d85de authored by Mady Mellor's avatar Mady Mellor
Browse files

Update group suppression for bubbles

When bubbles are opened or the notification for the bubble is dismissed
the group needs to be updated to factor in the new "count" of items in
that group.

* BubbleController notifies NotificationGroupManager to update suppression
  whenever a bubble is selected (i.e. notification for that bubble is
  hidden from shade)
* NotificationGroupManager checks if the children for a group are being
  suppressed from the shade due to bubbles, and factors that into whether
  the summary should be suppressed.
* BubbleController listens for group suppression changes to remove
  suppression in the case that you had a group, swiped the group away,
  and then more children were added to that group -- the summary should
  come back

Test: manual
   Open bubbles
   1) post a group of bubbles
   2) expand the stack and tap through each, after each tap check that
      the # of notifs in the group go down until the group is hidden

   Swipe & add bubble
   1) post a group of bubbles
   2) swipe the group away in the shade
   3) add the group again => note that the group appears in shade

Bug: 130250809
Change-Id: I3cfcdcbb0d9d17c51e2e5886e4f7e31a522b9085
parent e28fe10f
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
@@ -261,6 +261,23 @@ public class BubbleController implements ConfigurationController.ConfigurationLi
        mNotificationEntryManager.addNotificationEntryListener(mEntryListener);
        mNotificationEntryManager.setNotificationRemoveInterceptor(mRemoveInterceptor);
        mNotificationGroupManager = groupManager;
        mNotificationGroupManager.addOnGroupChangeListener(
                new NotificationGroupManager.OnGroupChangeListener() {
                    @Override
                    public void onGroupSuppressionChanged(
                            NotificationGroupManager.NotificationGroup group,
                            boolean suppressed) {
                        // More notifications could be added causing summary to no longer
                        // be suppressed -- in this case need to remove the key.
                        final String groupKey = group.summary != null
                                ? group.summary.notification.getGroupKey()
                                : null;
                        if (!suppressed && groupKey != null
                                && mBubbleData.isSummarySuppressed(groupKey)) {
                            mBubbleData.removeSuppressedSummary(groupKey);
                        }
                    }
                });

        mStatusBarWindowController = statusBarWindowController;
        mStatusBarStateListener = new StatusBarStateListener();
@@ -746,6 +763,10 @@ public class BubbleController implements ConfigurationController.ConfigurationLi

            if (update.selectionChanged) {
                mStackView.setSelectedBubble(update.selectedBubble);
                if (update.selectedBubble != null) {
                    mNotificationGroupManager.updateSuppression(
                            update.selectedBubble.getEntry());
                }
            }

            // Expanding? Apply this last.
+34 −3
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.util.ArraySet;
import android.util.Log;

import com.android.systemui.Dependency;
import com.android.systemui.bubbles.BubbleController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.statusbar.StatusBarState;
@@ -53,12 +54,20 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State
    private HashMap<String, StatusBarNotification> mIsolatedEntries = new HashMap<>();
    private HeadsUpManager mHeadsUpManager;
    private boolean mIsUpdatingUnchangedGroup;
    @Nullable private BubbleController mBubbleController = null;

    @Inject
    public NotificationGroupManager(StatusBarStateController statusBarStateController) {
        statusBarStateController.addCallback(this);
    }

    private BubbleController getBubbleController() {
        if (mBubbleController == null) {
            mBubbleController = Dependency.get(BubbleController.class);
        }
        return mBubbleController;
    }

    /**
     * Add a listener for changes to groups.
     *
@@ -187,12 +196,22 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State
        if (group == null) {
            return;
        }
        int childCount = 0;
        boolean hasBubbles = false;
        for (String key : group.children.keySet()) {
            if (!getBubbleController().isBubbleNotificationSuppressedFromShade(key)) {
                childCount++;
            } else {
                hasBubbles = true;
            }
        }

        boolean prevSuppressed = group.suppressed;
        group.suppressed = group.summary != null && !group.expanded
                && (group.children.size() == 1
                || (group.children.size() == 0
                && (childCount == 1
                || (childCount == 0
                        && group.summary.notification.getNotification().isGroupSummary()
                        && hasIsolatedChildren(group)));
                        && (hasIsolatedChildren(group) || hasBubbles)));
        if (prevSuppressed != group.suppressed) {
            for (OnGroupChangeListener listener : mListeners) {
                if (!mIsUpdatingUnchangedGroup) {
@@ -380,6 +399,17 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State
        return children;
    }

    /**
     * If there is a {@link NotificationGroup} associated with the provided entry, this method
     * will update the suppression of that group.
     */
    public void updateSuppression(NotificationEntry entry) {
        NotificationGroup group = mGroupMap.get(getGroupKey(entry.notification));
        if (group != null) {
            updateSuppression(group);
        }
    }

    /**
     * Get the group key. May differ from the one in the notification due to the notification
     * being temporarily isolated.
@@ -565,6 +595,7 @@ public class NotificationGroupManager implements OnHeadsUpChangedListener, State
                        ? Log.getStackTraceString(child.getDebugThrowable())
                        : "");
            }
            result += "\n    summary suppressed: " + suppressed;
            return result;
        }
    }