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

Commit fc02cc3b authored by Mady Mellor's avatar Mady Mellor
Browse files

Use FLAG_BUBBLE rather than setting the value ourselves

This flag will be the thing we use to know if something should be
in the bubble state, so lets get rid of this extra notion.

Previously we relied on BubbleController flagging the entry when
onPendingEntryAdded is called in the NotifEntryListener, now we can rely
on NoMan to tell us the right thing.

Also cleans up a little how createBubble works in NotifTestHelper

Bug: 129147774
Test: atest BubbleControllerTest
Change-Id: I828af8740ac9b62680b249d877da519a8a2271d0
parent ea94b786
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -395,7 +395,6 @@ public class BubbleController implements BubbleExpandedView.OnBubbleBlockedListe
            }
            if (shouldAutoBubbleForFlags(mContext, entry) || shouldBubble(entry)) {
                // TODO: handle group summaries
                entry.setIsBubble(true);
                boolean suppressNotification = entry.getBubbleMetadata() != null
                        && entry.getBubbleMetadata().getSuppressInitialNotification()
                        && isForegroundApp(entry.notification.getPackageName());
+2 −10
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static android.app.Notification.CATEGORY_CALL;
import static android.app.Notification.CATEGORY_EVENT;
import static android.app.Notification.CATEGORY_MESSAGE;
import static android.app.Notification.CATEGORY_REMINDER;
import static android.app.Notification.FLAG_BUBBLE;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_AMBIENT;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_FULL_SCREEN_INTENT;
import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST;
@@ -145,11 +146,6 @@ public final class NotificationEntry {
     */
    private boolean hasSentReply;

    /**
     * Whether this notification should be displayed as a bubble.
     */
    private boolean mIsBubble;

    /**
     * Whether this notification has been approved globally, at the app level, and at the channel
     * level for bubbling.
@@ -222,12 +218,8 @@ public final class NotificationEntry {
        this.mHighPriority = highPriority;
    }

    public void setIsBubble(boolean bubbleable) {
        mIsBubble = bubbleable;
    }

    public boolean isBubble() {
        return mIsBubble;
        return (notification.getNotification().flags & FLAG_BUBBLE) != 0;
    }

    public void setBubbleDismissed(boolean userDismissed) {
+15 −18
Original line number Diff line number Diff line
@@ -18,9 +18,12 @@ package com.android.systemui.bubbles;

import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;

import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
@@ -42,7 +45,6 @@ import android.widget.FrameLayout;

import androidx.test.filters.SmallTest;

import com.android.internal.statusbar.NotificationVisibility;
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.NotificationTestHelper;
@@ -96,9 +98,9 @@ public class BubbleControllerTest extends SysuiTestCase {
    private NotificationTestHelper mNotificationTestHelper;
    private ExpandableNotificationRow mRow;
    private ExpandableNotificationRow mRow2;
    private ExpandableNotificationRow mNoChannelRow;
    private ExpandableNotificationRow mAutoExpandRow;
    private ExpandableNotificationRow mSuppressNotifRow;
    private ExpandableNotificationRow mNonBubbleNotifRow;

    @Mock
    private NotificationData mNotificationData;
@@ -106,9 +108,6 @@ public class BubbleControllerTest extends SysuiTestCase {
    private BubbleController.BubbleStateChangeListener mBubbleStateChangeListener;
    @Mock
    private BubbleController.BubbleExpandListener mBubbleExpandListener;
    @Mock
    NotificationVisibility mNotificationVisibility;

    @Mock
    private PendingIntent mDeleteIntent;

@@ -129,7 +128,7 @@ public class BubbleControllerTest extends SysuiTestCase {
        mNotificationTestHelper = new NotificationTestHelper(mContext);
        mRow = mNotificationTestHelper.createBubble(mDeleteIntent);
        mRow2 = mNotificationTestHelper.createBubble(mDeleteIntent);
        mNoChannelRow = mNotificationTestHelper.createBubble(mDeleteIntent);
        mNonBubbleNotifRow = mNotificationTestHelper.createRow();

        // Some bubbles want to auto expand
        Notification.BubbleMetadata autoExpandMetadata =
@@ -146,7 +145,6 @@ public class BubbleControllerTest extends SysuiTestCase {
        // Return non-null notification data from the NEM
        when(mNotificationEntryManager.getNotificationData()).thenReturn(mNotificationData);
        when(mNotificationData.getChannel(mRow.getEntry().key)).thenReturn(mRow.getEntry().channel);
        when(mNotificationData.getChannel(mNoChannelRow.getEntry().key)).thenReturn(null);

        mBubbleData = new BubbleData();
        mBubbleController = new TestableBubbleController(mContext, mStatusBarWindowController,
@@ -391,8 +389,7 @@ public class BubbleControllerTest extends SysuiTestCase {
        mEntryListener.onPendingEntryAdded(mSuppressNotifRow.getEntry());
        mBubbleController.updateBubble(mSuppressNotifRow.getEntry(), true /* updatePosition */);

        // Should be a bubble & should show in shade because we weren't forground
        assertTrue(mSuppressNotifRow.getEntry().isBubble());
        // Should show in shade because we weren't forground
        assertTrue(mSuppressNotifRow.getEntry().showInShadeWhenBubble());

        // # of bubbles should change
@@ -428,8 +425,7 @@ public class BubbleControllerTest extends SysuiTestCase {
        mEntryListener.onPendingEntryAdded(mSuppressNotifRow.getEntry());
        mBubbleController.updateBubble(mSuppressNotifRow.getEntry(), true /* updatePosition */);

        // Should be a bubble & should NOT show in shade because we were foreground
        assertTrue(mSuppressNotifRow.getEntry().isBubble());
        // Should NOT show in shade because we were foreground
        assertFalse(mSuppressNotifRow.getEntry().showInShadeWhenBubble());

        // # of bubbles should change
@@ -444,8 +440,6 @@ public class BubbleControllerTest extends SysuiTestCase {
        mEntryListener.onPendingEntryAdded(mRow.getEntry());
        mBubbleController.updateBubble(mRow.getEntry(), true /* updatePosition */);

        assertTrue(mRow.getEntry().isBubble());

        // Simulate notification cancellation.
        mEntryListener.onEntryRemoved(mRow.getEntry(), null /* notificationVisibility (unused) */,
                false /* removedbyUser */);
@@ -454,15 +448,18 @@ public class BubbleControllerTest extends SysuiTestCase {
    }

    @Test
    public void testMarkNewNotificationAsBubble() {
    public void testMarkNewNotificationAsShowInShade() {
        mEntryListener.onPendingEntryAdded(mRow.getEntry());
        assertTrue(mRow.getEntry().isBubble());
        assertTrue(mRow.getEntry().showInShadeWhenBubble());
    }

    @Test
    public void testMarkNewNotificationAsShowInShade() {
        mEntryListener.onPendingEntryAdded(mRow.getEntry());
        assertTrue(mRow.getEntry().showInShadeWhenBubble());
    public void testAddNotif_notBubble() {
        mEntryListener.onPendingEntryAdded(mNonBubbleNotifRow.getEntry());
        mEntryListener.onPreEntryUpdated(mNonBubbleNotifRow.getEntry());

        verify(mBubbleStateChangeListener, never()).onHasBubblesChanged(anyBoolean());
        assertThat(mBubbleController.hasBubbles()).isFalse();
    }

    @Test
+4 −18
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar;

import static android.app.Notification.FLAG_BUBBLE;
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_HIGH;

@@ -154,9 +155,7 @@ public class NotificationTestHelper {
     */
    public ExpandableNotificationRow createBubble()
            throws Exception {
        Notification n = createNotification(false /* isGroupSummary */,
                null /* groupKey */, makeBubbleMetadata(null));
        return generateRow(n, PKG, UID, USER_HANDLE, 0 /* extraInflationFlags */, IMPORTANCE_HIGH);
        return createBubble(makeBubbleMetadata(null), PKG);
    }

    /**
@@ -166,21 +165,7 @@ public class NotificationTestHelper {
     */
    public ExpandableNotificationRow createBubble(@Nullable PendingIntent deleteIntent)
            throws Exception {
        Notification n = createNotification(false /* isGroupSummary */,
                null /* groupKey */, makeBubbleMetadata(deleteIntent));
        return generateRow(n, PKG, UID, USER_HANDLE, 0 /* extraInflationFlags */, IMPORTANCE_HIGH);
    }

    /**
     * Returns an {@link ExpandableNotificationRow} that should be shown as a bubble.
     *
     * @param bubbleMetadata the {@link BubbleMetadata} to use
     */
    public ExpandableNotificationRow createBubble(BubbleMetadata bubbleMetadata)
            throws Exception {
        Notification n = createNotification(false /* isGroupSummary */,
                null /* groupKey */, bubbleMetadata);
        return generateRow(n, PKG, UID, USER_HANDLE, 0 /* extraInflationFlags */, IMPORTANCE_HIGH);
        return createBubble(makeBubbleMetadata(deleteIntent), PKG);
    }

    /**
@@ -192,6 +177,7 @@ public class NotificationTestHelper {
            throws Exception {
        Notification n = createNotification(false /* isGroupSummary */,
                null /* groupKey */, bubbleMetadata);
        n.flags |= FLAG_BUBBLE;
        return generateRow(n, pkg, UID, USER_HANDLE, 0 /* extraInflationFlags */, IMPORTANCE_HIGH);
    }

+0 −1
Original line number Diff line number Diff line
@@ -152,7 +152,6 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase {
        bubbleSbn.getNotification().contentIntent = mContentIntent;
        bubbleSbn.getNotification().flags |= Notification.FLAG_AUTO_CANCEL;
        // Do what BubbleController's NotificationEntryListener#onPendingEntryAdded does:
        mBubbleNotificationRow.getEntry().setIsBubble(true);
        mBubbleNotificationRow.getEntry().setShowInShadeWhenBubble(true);

        mActiveNotifications = new ArrayList<>();