summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Winson Chung <winsonc@google.com> 2021-06-18 21:34:29 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-06-18 21:34:29 +0000
commit979fe90f43a12432e58ed1598693ad975b37449f (patch)
tree6dc5b6997f1fd153f689e3e5905d77c119280c35
parentfcf3dca8c980ba291eed93bc1734d6c85bd3d901 (diff)
parent523ab2ab6fa1808be04c14559afa5baaa62793c0 (diff)
Merge "Add cached state to prevent blocking calls from SysUI->Shell" into sc-dev
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java9
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java162
-rw-r--r--libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java12
-rw-r--r--packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java2
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java165
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java165
6 files changed, 332 insertions, 183 deletions
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
index afb40d1ff95c..9d65d28b21b4 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/Bubble.java
@@ -284,6 +284,15 @@ public class Bubble implements BubbleViewProvider {
return mTitle;
}
+ /**
+ * @return the ShortcutInfo id if it exists, or the metadata shortcut id otherwise.
+ */
+ String getShortcutId() {
+ return getShortcutInfo() != null
+ ? getShortcutInfo().getId()
+ : getMetadataShortcutId();
+ }
+
String getMetadataShortcutId() {
return mMetadataShortcutId;
}
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
index dfd878f63283..202d9f013cc0 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleController.java
@@ -93,6 +93,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.Executor;
@@ -265,15 +266,7 @@ public class BubbleController {
public void initialize() {
mBubbleData.setListener(mBubbleDataListener);
- mBubbleData.setSuppressionChangedListener(bubble -> {
- // Make sure NoMan knows suppression state so that anyone querying it can tell.
- try {
- mBarService.onBubbleNotificationSuppressionChanged(bubble.getKey(),
- !bubble.showInShade(), bubble.isSuppressed());
- } catch (RemoteException e) {
- // Bad things have happened
- }
- });
+ mBubbleData.setSuppressionChangedListener(this::onBubbleNotificationSuppressionChanged);
mBubbleData.setPendingIntentCancelledListener(bubble -> {
if (bubble.getBubbleIntent() == null) {
@@ -401,6 +394,11 @@ public class BubbleController {
return mImpl;
}
+ @VisibleForTesting
+ public BubblesImpl.CachedState getImplCachedState() {
+ return mImpl.mCachedState;
+ }
+
public ShellExecutor getMainExecutor() {
return mMainExecutor;
}
@@ -500,6 +498,18 @@ public class BubbleController {
updateStack();
}
+ @VisibleForTesting
+ public void onBubbleNotificationSuppressionChanged(Bubble bubble) {
+ // Make sure NoMan knows suppression state so that anyone querying it can tell.
+ try {
+ mBarService.onBubbleNotificationSuppressionChanged(bubble.getKey(),
+ !bubble.showInShade(), bubble.isSuppressed());
+ } catch (RemoteException e) {
+ // Bad things have happened
+ }
+ mImpl.mCachedState.updateBubbleSuppressedState(bubble);
+ }
+
/** Called when the current user changes. */
@VisibleForTesting
public void onUserChanged(int newUserId) {
@@ -808,11 +818,6 @@ public class BubbleController {
}
}
- private boolean isBubbleExpanded(String key) {
- return isStackExpanded() && mBubbleData != null && mBubbleData.getSelectedBubble() != null
- && mBubbleData.getSelectedBubble().getKey().equals(key);
- }
-
/** Promote the provided bubble from the overflow view. */
public void promoteBubbleFromOverflow(Bubble bubble) {
mLogger.log(bubble, BubbleLogger.Event.BUBBLE_OVERFLOW_REMOVE_BACK_TO_STACK);
@@ -1191,6 +1196,9 @@ public class BubbleController {
mSysuiProxy.notifyInvalidateNotifications("BubbleData.Listener.applyUpdate");
updateStack();
+
+ // Update the cached state for queries from SysUI
+ mImpl.mCachedState.update(update);
}
};
@@ -1364,25 +1372,124 @@ public class BubbleController {
}
private class BubblesImpl implements Bubbles {
+ // Up-to-date cached state of bubbles data for SysUI to query from the calling thread
+ @VisibleForTesting
+ public class CachedState {
+ private boolean mIsStackExpanded;
+ private String mSelectedBubbleKey;
+ private HashSet<String> mSuppressedBubbleKeys = new HashSet<>();
+ private HashMap<String, String> mSuppressedGroupToNotifKeys = new HashMap<>();
+ private HashMap<String, Bubble> mShortcutIdToBubble = new HashMap<>();
+
+ private ArrayList<Bubble> mTmpBubbles = new ArrayList<>();
+
+ /**
+ * Updates the cached state based on the last full BubbleData change.
+ */
+ synchronized void update(BubbleData.Update update) {
+ if (update.selectionChanged) {
+ mSelectedBubbleKey = update.selectedBubble != null
+ ? update.selectedBubble.getKey()
+ : null;
+ }
+ if (update.expandedChanged) {
+ mIsStackExpanded = update.expanded;
+ }
+ if (update.suppressedSummaryChanged) {
+ String summaryKey =
+ mBubbleData.getSummaryKey(update.suppressedSummaryGroup);
+ if (summaryKey != null) {
+ mSuppressedGroupToNotifKeys.put(update.suppressedSummaryGroup, summaryKey);
+ } else {
+ mSuppressedGroupToNotifKeys.remove(update.suppressedSummaryGroup);
+ }
+ }
+
+ mTmpBubbles.clear();
+ mTmpBubbles.addAll(update.bubbles);
+ mTmpBubbles.addAll(update.overflowBubbles);
+
+ mSuppressedBubbleKeys.clear();
+ mShortcutIdToBubble.clear();
+ for (Bubble b : mTmpBubbles) {
+ mShortcutIdToBubble.put(b.getShortcutId(), b);
+ updateBubbleSuppressedState(b);
+ }
+ }
+
+ /**
+ * Updates a specific bubble suppressed state. This is used mainly because notification
+ * suppression changes don't go through the same BubbleData update mechanism.
+ */
+ synchronized void updateBubbleSuppressedState(Bubble b) {
+ if (!b.showInShade()) {
+ mSuppressedBubbleKeys.add(b.getKey());
+ } else {
+ mSuppressedBubbleKeys.remove(b.getKey());
+ }
+ }
+
+ public synchronized boolean isStackExpanded() {
+ return mIsStackExpanded;
+ }
+
+ public synchronized boolean isBubbleExpanded(String key) {
+ return mIsStackExpanded && key.equals(mSelectedBubbleKey);
+ }
+
+ public synchronized boolean isBubbleNotificationSuppressedFromShade(String key,
+ String groupKey) {
+ return mSuppressedBubbleKeys.contains(key)
+ || (mSuppressedGroupToNotifKeys.containsKey(groupKey)
+ && key.equals(mSuppressedGroupToNotifKeys.get(groupKey)));
+ }
+
+ @Nullable
+ public synchronized Bubble getBubbleWithShortcutId(String id) {
+ return mShortcutIdToBubble.get(id);
+ }
+
+ synchronized void dump(PrintWriter pw) {
+ pw.println("BubbleImpl.CachedState state:");
+
+ pw.println("mIsStackExpanded: " + mIsStackExpanded);
+ pw.println("mSelectedBubbleKey: " + mSelectedBubbleKey);
+
+ pw.print("mSuppressedBubbleKeys: ");
+ pw.println(mSuppressedBubbleKeys.size());
+ for (String key : mSuppressedBubbleKeys) {
+ pw.println(" suppressing: " + key);
+ }
+
+ pw.print("mSuppressedGroupToNotifKeys: ");
+ pw.println(mSuppressedGroupToNotifKeys.size());
+ for (String key : mSuppressedGroupToNotifKeys.keySet()) {
+ pw.println(" suppressing: " + key);
+ }
+ }
+ }
+
+ private CachedState mCachedState = new CachedState();
+
@Override
public boolean isBubbleNotificationSuppressedFromShade(String key, String groupKey) {
- return mMainExecutor.executeBlockingForResult(() -> {
- return BubbleController.this.isBubbleNotificationSuppressedFromShade(key, groupKey);
- }, Boolean.class);
+ return mCachedState.isBubbleNotificationSuppressedFromShade(key, groupKey);
}
@Override
public boolean isBubbleExpanded(String key) {
- return mMainExecutor.executeBlockingForResult(() -> {
- return BubbleController.this.isBubbleExpanded(key);
- }, Boolean.class);
+ return mCachedState.isBubbleExpanded(key);
}
@Override
public boolean isStackExpanded() {
- return mMainExecutor.executeBlockingForResult(() -> {
- return BubbleController.this.isStackExpanded();
- }, Boolean.class);
+ return mCachedState.isStackExpanded();
+ }
+
+ @Override
+ @Nullable
+ public Bubble getBubbleWithShortcutId(String shortcutId) {
+ return mCachedState.getBubbleWithShortcutId(shortcutId);
}
@Override
@@ -1425,14 +1532,6 @@ public class BubbleController {
}
@Override
- @Nullable
- public Bubble getBubbleWithShortcutId(String shortcutId) {
- return mMainExecutor.executeBlockingForResult(() -> {
- return BubbleController.this.mBubbleData.getAnyBubbleWithShortcutId(shortcutId);
- }, Bubble.class);
- }
-
- @Override
public void onTaskbarChanged(Bundle b) {
mMainExecutor.execute(() -> {
BubbleController.this.onTaskbarChanged(b);
@@ -1555,6 +1654,7 @@ public class BubbleController {
try {
mMainExecutor.executeBlocking(() -> {
BubbleController.this.dump(fd, pw, args);
+ mCachedState.dump(pw);
});
} catch (InterruptedException e) {
Slog.e(TAG, "Failed to dump BubbleController in 2s");
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
index 6f5cfd114688..d73ce6951e6d 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubbleData.java
@@ -73,6 +73,7 @@ public class BubbleData {
boolean expandedChanged;
boolean selectionChanged;
boolean orderChanged;
+ boolean suppressedSummaryChanged;
boolean expanded;
@Nullable BubbleViewProvider selectedBubble;
@Nullable Bubble addedBubble;
@@ -81,6 +82,7 @@ public class BubbleData {
@Nullable Bubble removedOverflowBubble;
@Nullable Bubble suppressedBubble;
@Nullable Bubble unsuppressedBubble;
+ @Nullable String suppressedSummaryGroup;
// Pair with Bubble and @DismissReason Integer
final List<Pair<Bubble, Integer>> removedBubbles = new ArrayList<>();
@@ -103,7 +105,9 @@ public class BubbleData {
|| removedOverflowBubble != null
|| orderChanged
|| suppressedBubble != null
- || unsuppressedBubble != null;
+ || unsuppressedBubble != null
+ || suppressedSummaryChanged
+ || suppressedSummaryGroup != null;
}
void bubbleRemoved(Bubble bubbleToRemove, @DismissReason int reason) {
@@ -380,6 +384,9 @@ public class BubbleData {
*/
void addSummaryToSuppress(String groupKey, String notifKey) {
mSuppressedGroupKeys.put(groupKey, notifKey);
+ mStateChange.suppressedSummaryChanged = true;
+ mStateChange.suppressedSummaryGroup = groupKey;
+ dispatchPendingChanges();
}
/**
@@ -397,6 +404,9 @@ public class BubbleData {
*/
void removeSuppressedSummary(String groupKey) {
mSuppressedGroupKeys.remove(groupKey);
+ mStateChange.suppressedSummaryChanged = true;
+ mStateChange.suppressedSummaryGroup = groupKey;
+ dispatchPendingChanges();
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
index 5441bd4c958d..a29a638b91a8 100644
--- a/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
+++ b/packages/SystemUI/src/com/android/systemui/wmshell/BubblesManager.java
@@ -617,7 +617,7 @@ public class BubblesManager implements Dumpable {
* cancel it (and hence the bubbles associated with it).
*
* @return true if we want to intercept the dismissal of the entry, else false.
- * @see Bubbles#handleDismissalInterception(BubbleEntry, List, IntConsumer)
+ * @see Bubbles#handleDismissalInterception(BubbleEntry, List, IntConsumer, Executor)
*/
public boolean handleDismissalInterception(NotificationEntry entry) {
if (entry == null) {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
index 496976e8f55c..9fa35f8bd9f6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/BubblesTest.java
@@ -23,6 +23,8 @@ import static android.service.notification.NotificationListenerService.REASON_CA
import static android.service.notification.NotificationListenerService.REASON_CANCEL_ALL;
import static android.service.notification.NotificationListenerService.REASON_GROUP_SUMMARY_CANCELED;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
@@ -37,6 +39,7 @@ import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -324,6 +327,7 @@ public class BubblesTest extends SysuiTestCase {
syncExecutor,
mock(Handler.class));
mBubbleController.setExpandListener(mBubbleExpandListener);
+ spyOn(mBubbleController);
mBubblesManager = new BubblesManager(
mContext,
@@ -470,7 +474,7 @@ public class BubblesTest extends SysuiTestCase {
@Test
public void testExpandCollapseStack() {
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
// Mark it as a bubble and add it explicitly
mEntryListener.onPendingEntryAdded(mRow);
@@ -478,25 +482,23 @@ public class BubblesTest extends SysuiTestCase {
// We should have bubbles & their notifs should not be suppressed
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
// Expand the stack
BubbleStackView stackView = mBubbleController.getStackView();
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
assertTrue(mSysUiStateBubblesExpanded);
// Make sure the notif is suppressed
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Collapse
mBubbleController.collapseStack();
verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getKey());
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
assertFalse(mSysUiStateBubblesExpanded);
}
@@ -512,15 +514,13 @@ public class BubblesTest extends SysuiTestCase {
// We should have bubbles & their notifs should not be suppressed
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry2.getKey(), mBubbleEntry2.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry2);
// Expand
BubbleStackView stackView = mBubbleController.getStackView();
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
true, mRow2.getKey());
@@ -528,8 +528,7 @@ public class BubblesTest extends SysuiTestCase {
// Last added is the one that is expanded
assertEquals(mRow2.getKey(), mBubbleData.getSelectedBubble().getKey());
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry2.getKey(), mBubbleEntry2.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry2);
// Switch which bubble is expanded
mBubbleData.setSelectedBubble(mBubbleData.getBubbleInStackWithKey(
@@ -537,8 +536,7 @@ public class BubblesTest extends SysuiTestCase {
mBubbleData.setExpanded(true);
assertEquals(mRow.getKey(), mBubbleData.getBubbleInStackWithKey(
stackView.getExpandedBubble().getKey()).getKey());
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// collapse for previous bubble
verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
@@ -549,7 +547,7 @@ public class BubblesTest extends SysuiTestCase {
// Collapse
mBubbleController.collapseStack();
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
assertFalse(mSysUiStateBubblesExpanded);
}
@@ -562,22 +560,20 @@ public class BubblesTest extends SysuiTestCase {
// We should have bubbles & their notifs should not be suppressed
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mTestableLooper.processAllMessages();
assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
// Expand
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
assertTrue(mSysUiStateBubblesExpanded);
// Notif is suppressed after expansion
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Notif shouldn't show dot after expansion
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
}
@@ -590,22 +586,20 @@ public class BubblesTest extends SysuiTestCase {
// We should have bubbles & their notifs should not be suppressed
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mTestableLooper.processAllMessages();
assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
// Expand
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
assertTrue(mSysUiStateBubblesExpanded);
// Notif is suppressed after expansion
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Notif shouldn't show dot after expansion
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
@@ -614,8 +608,7 @@ public class BubblesTest extends SysuiTestCase {
// Nothing should have changed
// Notif is suppressed after expansion
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Notif shouldn't show dot after expansion
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
}
@@ -634,14 +627,13 @@ public class BubblesTest extends SysuiTestCase {
assertTrue(mSysUiStateBubblesExpanded);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow2.getKey());
// Last added is the one that is expanded
assertEquals(mRow2.getKey(), mBubbleData.getBubbleInStackWithKey(
stackView.getExpandedBubble().getKey()).getKey());
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry2.getKey(), mBubbleEntry2.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry2);
// Dismiss currently expanded
mBubbleController.removeBubble(
@@ -679,7 +671,7 @@ public class BubblesTest extends SysuiTestCase {
mBubbleData.setExpanded(true);
assertTrue(mSysUiStateBubblesExpanded);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
// Block the bubble so it won't be in the overflow
@@ -698,7 +690,7 @@ public class BubblesTest extends SysuiTestCase {
@Test
public void testAutoExpand_fails_noFlag() {
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
setMetadataFlags(mRow,
Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE, false /* enableFlag */);
@@ -709,7 +701,7 @@ public class BubblesTest extends SysuiTestCase {
// Expansion shouldn't change
verify(mBubbleExpandListener, never()).onBubbleExpandChanged(false /* expanded */,
mRow.getKey());
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
assertFalse(mSysUiStateBubblesExpanded);
}
@@ -726,7 +718,7 @@ public class BubblesTest extends SysuiTestCase {
// Expansion should change
verify(mBubbleExpandListener).onBubbleExpandChanged(true /* expanded */,
mRow.getKey());
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
assertTrue(mSysUiStateBubblesExpanded);
}
@@ -741,8 +733,7 @@ public class BubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
// Notif should be suppressed because we were foreground
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Dot + flyout is hidden because notif is suppressed
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showFlyout());
@@ -755,8 +746,7 @@ public class BubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
// Should not be suppressed
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
// Should show dot
assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
@@ -766,8 +756,7 @@ public class BubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
// Notif should be suppressed
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Dot + flyout is hidden because notif is suppressed
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showFlyout());
@@ -792,8 +781,7 @@ public class BubblesTest extends SysuiTestCase {
@Test
public void testMarkNewNotificationAsShowInShade() {
mEntryListener.onPendingEntryAdded(mRow);
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mTestableLooper.processAllMessages();
assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
@@ -878,8 +866,7 @@ public class BubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
boolean intercepted = mRemoveInterceptor.onNotificationRemoveRequested(
mRow.getKey(), mRow, REASON_CANCEL_ALL);
@@ -887,8 +874,7 @@ public class BubblesTest extends SysuiTestCase {
// Intercept!
assertTrue(intercepted);
// Should update show in shade state
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
}
@Test
@@ -897,8 +883,7 @@ public class BubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
boolean intercepted = mRemoveInterceptor.onNotificationRemoveRequested(
mRow.getKey(), mRow, REASON_CANCEL);
@@ -906,8 +891,7 @@ public class BubblesTest extends SysuiTestCase {
// Intercept!
assertTrue(intercepted);
// Should update show in shade state
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
}
@Test
@@ -916,8 +900,7 @@ public class BubblesTest extends SysuiTestCase {
mEntryListener.onPendingEntryAdded(mRow);
mBubbleController.updateBubble(mBubbleEntry);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
// Dismiss the bubble into overflow.
mBubbleController.removeBubble(
@@ -938,8 +921,7 @@ public class BubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mBubbleController.removeBubble(
mRow.getKey(), Bubbles.DISMISS_NO_LONGER_BUBBLE);
@@ -985,48 +967,36 @@ public class BubblesTest extends SysuiTestCase {
@Test
public void testNotifyShadeSuppressionChange_notificationDismiss() {
- Bubbles.SuppressionChangedListener listener =
- mock(Bubbles.SuppressionChangedListener.class);
- mBubbleData.setSuppressionChangedListener(listener);
-
mEntryListener.onPendingEntryAdded(mRow);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mRemoveInterceptor.onNotificationRemoveRequested(
mRow.getKey(), mRow, REASON_CANCEL);
// Should update show in shade state
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Should notify delegate that shade state changed
- verify(listener).onBubbleNotificationSuppressionChange(
+ verify(mBubbleController).onBubbleNotificationSuppressionChanged(
mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
}
@Test
public void testNotifyShadeSuppressionChange_bubbleExpanded() {
- Bubbles.SuppressionChangedListener listener =
- mock(Bubbles.SuppressionChangedListener.class);
- mBubbleData.setSuppressionChangedListener(listener);
-
mEntryListener.onPendingEntryAdded(mRow);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mBubbleData.setExpanded(true);
// Once a bubble is expanded the notif is suppressed
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Should notify delegate that shade state changed
- verify(listener).onBubbleNotificationSuppressionChange(
+ verify(mBubbleController).onBubbleNotificationSuppressionChanged(
mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
}
@@ -1046,7 +1016,11 @@ public class BubblesTest extends SysuiTestCase {
// THEN the summary and bubbled child are suppressed from the shade
assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- groupedBubble.getEntry().getKey(), groupSummary.getEntry().getSbn().getGroupKey()));
+ groupedBubble.getEntry().getKey(),
+ groupSummary.getEntry().getSbn().getGroupKey()));
+ assertTrue(mBubbleController.getImplCachedState().isBubbleNotificationSuppressedFromShade(
+ groupedBubble.getEntry().getKey(),
+ groupSummary.getEntry().getSbn().getGroupKey()));
assertTrue(mBubbleData.isSummarySuppressed(groupSummary.getEntry().getSbn().getGroupKey()));
}
@@ -1102,6 +1076,9 @@ public class BubblesTest extends SysuiTestCase {
assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
groupedBubble.getEntry().getKey(),
groupedBubble.getEntry().getSbn().getGroupKey()));
+ assertTrue(mBubbleController.getImplCachedState().isBubbleNotificationSuppressedFromShade(
+ groupedBubble.getEntry().getKey(),
+ groupedBubble.getEntry().getSbn().getGroupKey()));
// THEN the summary is removed from GroupManager
verify(mNotificationGroupManager, times(1)).onEntryRemoved(groupSummary.getEntry());
@@ -1257,4 +1234,42 @@ public class BubblesTest extends SysuiTestCase {
Icon.createWithResource(mContext, R.drawable.bubble_ic_create_bubble))
.build();
}
+
+ /**
+ * Asserts that the bubble stack is expanded and also validates the cached state is updated.
+ */
+ private void assertStackExpanded() {
+ assertTrue(mBubbleController.isStackExpanded());
+ assertTrue(mBubbleController.getImplCachedState().isStackExpanded());
+ }
+
+ /**
+ * Asserts that the bubble stack is collapsed and also validates the cached state is updated.
+ */
+ private void assertStackCollapsed() {
+ assertFalse(mBubbleController.isStackExpanded());
+ assertFalse(mBubbleController.getImplCachedState().isStackExpanded());
+ }
+
+ /**
+ * Asserts that a bubble notification is suppressed from the shade and also validates the cached
+ * state is updated.
+ */
+ private void assertBubbleNotificationSuppressedFromShade(BubbleEntry entry) {
+ assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
+ entry.getKey(), entry.getGroupKey()));
+ assertTrue(mBubbleController.getImplCachedState().isBubbleNotificationSuppressedFromShade(
+ entry.getKey(), entry.getGroupKey()));
+ }
+
+ /**
+ * Asserts that a bubble notification is not suppressed from the shade and also validates the
+ * cached state is updated.
+ */
+ private void assertBubbleNotificationNotSuppressedFromShade(BubbleEntry entry) {
+ assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
+ entry.getKey(), entry.getGroupKey()));
+ assertFalse(mBubbleController.getImplCachedState().isBubbleNotificationSuppressedFromShade(
+ entry.getKey(), entry.getGroupKey()));
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
index 9114b7a35fd2..55cc8bb1780d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/wmshell/NewNotifPipelineBubblesTest.java
@@ -19,6 +19,8 @@ package com.android.systemui.wmshell;
import static android.app.Notification.FLAG_BUBBLE;
import static android.service.notification.NotificationListenerService.REASON_GROUP_SUMMARY_CANCELED;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
+
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertEquals;
@@ -268,6 +270,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
syncExecutor,
mock(Handler.class));
mBubbleController.setExpandListener(mBubbleExpandListener);
+ spyOn(mBubbleController);
mBubblesManager = new BubblesManager(
mContext,
@@ -328,8 +331,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
// Make it look like dismissed notif
mBubbleData.getBubbleInStackWithKey(mRow.getKey()).setSuppressNotification(true);
@@ -352,8 +354,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
.thenReturn(mRow);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
// Make it look like dismissed notif
mBubbleData.getBubbleInStackWithKey(mRow.getKey()).setSuppressNotification(true);
@@ -388,7 +389,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
@Test
public void testExpandCollapseStack() {
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
// Mark it as a bubble and add it explicitly
mEntryListener.onEntryAdded(mRow);
@@ -396,23 +397,20 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
// We should have bubbles & their notifs should not be suppressed
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
// Expand the stack
- BubbleStackView stackView = mBubbleController.getStackView();
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
// Make sure the notif is suppressed
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Collapse
mBubbleController.collapseStack();
verify(mBubbleExpandListener).onBubbleExpandChanged(false, mRow.getKey());
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
}
@Test
@@ -426,22 +424,19 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
// We should have bubbles & their notifs should not be suppressed
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry2);
// Expand
BubbleStackView stackView = mBubbleController.getStackView();
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
true, mRow2.getKey());
// Last added is the one that is expanded
assertEquals(mRow2.getKey(), mBubbleData.getSelectedBubble().getKey());
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry2.getKey(), mBubbleEntry2.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry2);
// Switch which bubble is expanded
mBubbleData.setSelectedBubble(mBubbleData.getBubbleInStackWithKey(
@@ -449,8 +444,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mBubbleData.setExpanded(true);
assertEquals(mRow.getKey(), mBubbleData.getBubbleInStackWithKey(
stackView.getExpandedBubble().getKey()).getKey());
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// collapse for previous bubble
verify(mBubbleExpandListener, atLeastOnce()).onBubbleExpandChanged(
@@ -462,7 +456,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
// Collapse
mBubbleController.collapseStack();
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
}
@Test
@@ -473,20 +467,18 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
// We should have bubbles & their notifs should not be suppressed
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mTestableLooper.processAllMessages();
assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
// Expand
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
// Notif is suppressed after expansion
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Notif shouldn't show dot after expansion
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
}
@@ -499,20 +491,18 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
// We should have bubbles & their notifs should not be suppressed
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mTestableLooper.processAllMessages();
assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
// Expand
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
// Notif is suppressed after expansion
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Notif shouldn't show dot after expansion
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
@@ -521,8 +511,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
// Nothing should have changed
// Notif is suppressed after expansion
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Notif shouldn't show dot after expansion
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
}
@@ -539,14 +528,13 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
BubbleStackView stackView = mBubbleController.getStackView();
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow2.getKey());
// Last added is the one that is expanded
assertEquals(mRow2.getKey(), mBubbleData.getBubbleInStackWithKey(
stackView.getExpandedBubble().getKey()).getKey());
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry2.getKey(), mBubbleEntry2.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry2);
// Dismiss currently expanded
mBubbleController.removeBubble(
@@ -582,7 +570,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
BubbleStackView stackView = mBubbleController.getStackView();
mBubbleData.setExpanded(true);
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
verify(mBubbleExpandListener).onBubbleExpandChanged(true, mRow.getKey());
// Block the bubble so it won't be in the overflow
@@ -601,7 +589,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
@Test
public void testAutoExpand_fails_noFlag() {
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
setMetadataFlags(mRow,
Notification.BubbleMetadata.FLAG_AUTO_EXPAND_BUBBLE, false /* enableFlag */);
@@ -612,7 +600,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
// Expansion shouldn't change
verify(mBubbleExpandListener, never()).onBubbleExpandChanged(false /* expanded */,
mRow.getKey());
- assertFalse(mBubbleController.isStackExpanded());
+ assertStackCollapsed();
}
@Test
@@ -627,7 +615,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
// Expansion should change
verify(mBubbleExpandListener).onBubbleExpandChanged(true /* expanded */,
mRow.getKey());
- assertTrue(mBubbleController.isStackExpanded());
+ assertStackExpanded();
}
@Test
@@ -640,8 +628,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
// Notif should be suppressed because we were foreground
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Dot + flyout is hidden because notif is suppressed
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showFlyout());
@@ -652,8 +639,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
// Should not be suppressed
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
// Should show dot
assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
@@ -663,8 +649,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
// Notif should be suppressed
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Dot + flyout is hidden because notif is suppressed
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
assertFalse(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showFlyout());
@@ -673,8 +658,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
@Test
public void testMarkNewNotificationAsShowInShade() {
mEntryListener.onEntryAdded(mRow);
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mTestableLooper.processAllMessages();
assertTrue(mBubbleData.getBubbleInStackWithKey(mRow.getKey()).showDot());
@@ -745,16 +729,14 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
boolean intercepted = mBubblesManager.handleDismissalInterception(mRow);
// Intercept!
assertTrue(intercepted);
// Should update show in shade state
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
}
@Test
@@ -763,8 +745,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
// Dismiss the bubble
mBubbleController.removeBubble(mRow.getKey(), Bubbles.DISMISS_USER_GESTURE);
@@ -783,8 +764,7 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
mBubbleController.updateBubble(mBubbleEntry);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
// Dismiss the bubble
mBubbleController.removeBubble(mRow.getKey(), Bubbles.DISMISS_NOTIF_CANCEL);
@@ -799,47 +779,35 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
@Test
public void testNotifyShadeSuppressionChange_notificationDismiss() {
- Bubbles.SuppressionChangedListener listener =
- mock(Bubbles.SuppressionChangedListener.class);
- mBubbleData.setSuppressionChangedListener(listener);
-
mEntryListener.onEntryAdded(mRow);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mBubblesManager.handleDismissalInterception(mRow);
// Should update show in shade state
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Should notify delegate that shade state changed
- verify(listener).onBubbleNotificationSuppressionChange(
+ verify(mBubbleController).onBubbleNotificationSuppressionChanged(
mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
}
@Test
public void testNotifyShadeSuppressionChange_bubbleExpanded() {
- Bubbles.SuppressionChangedListener listener =
- mock(Bubbles.SuppressionChangedListener.class);
- mBubbleData.setSuppressionChangedListener(listener);
-
mEntryListener.onEntryAdded(mRow);
assertTrue(mBubbleController.hasBubbles());
- assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationNotSuppressedFromShade(mBubbleEntry);
mBubbleData.setExpanded(true);
// Once a bubble is expanded the notif is suppressed
- assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
- mBubbleEntry.getKey(), mBubbleEntry.getGroupKey()));
+ assertBubbleNotificationSuppressedFromShade(mBubbleEntry);
// Should notify delegate that shade state changed
- verify(listener).onBubbleNotificationSuppressionChange(
+ verify(mBubbleController).onBubbleNotificationSuppressionChanged(
mBubbleData.getBubbleInStackWithKey(mRow.getKey()));
}
@@ -861,6 +829,9 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
groupedBubble.getEntry().getKey(),
groupedBubble.getEntry().getSbn().getGroupKey()));
+ assertTrue(mBubbleController.getImplCachedState().isBubbleNotificationSuppressedFromShade(
+ groupedBubble.getEntry().getKey(),
+ groupedBubble.getEntry().getSbn().getGroupKey()));
assertTrue(mBubbleData.isSummarySuppressed(groupSummary.getEntry().getSbn().getGroupKey()));
}
@@ -915,11 +886,17 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
groupedBubble.getEntry().getKey(),
groupedBubble.getEntry().getSbn().getGroupKey()));
+ assertTrue(mBubbleController.getImplCachedState().isBubbleNotificationSuppressedFromShade(
+ groupedBubble.getEntry().getKey(),
+ groupedBubble.getEntry().getSbn().getGroupKey()));
// THEN the summary is also suppressed from the shade
assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
groupSummary.getEntry().getKey(),
groupSummary.getEntry().getSbn().getGroupKey()));
+ assertTrue(mBubbleController.getImplCachedState().isBubbleNotificationSuppressedFromShade(
+ groupSummary.getEntry().getKey(),
+ groupSummary.getEntry().getSbn().getGroupKey()));
}
/**
@@ -938,4 +915,42 @@ public class NewNotifPipelineBubblesTest extends SysuiTestCase {
}
bubbleMetadata.setFlags(flags);
}
+
+ /**
+ * Asserts that the bubble stack is expanded and also validates the cached state is updated.
+ */
+ private void assertStackExpanded() {
+ assertTrue(mBubbleController.isStackExpanded());
+ assertTrue(mBubbleController.getImplCachedState().isStackExpanded());
+ }
+
+ /**
+ * Asserts that the bubble stack is collapsed and also validates the cached state is updated.
+ */
+ private void assertStackCollapsed() {
+ assertFalse(mBubbleController.isStackExpanded());
+ assertFalse(mBubbleController.getImplCachedState().isStackExpanded());
+ }
+
+ /**
+ * Asserts that a bubble notification is suppressed from the shade and also validates the cached
+ * state is updated.
+ */
+ private void assertBubbleNotificationSuppressedFromShade(BubbleEntry entry) {
+ assertTrue(mBubbleController.isBubbleNotificationSuppressedFromShade(
+ entry.getKey(), entry.getGroupKey()));
+ assertTrue(mBubbleController.getImplCachedState().isBubbleNotificationSuppressedFromShade(
+ entry.getKey(), entry.getGroupKey()));
+ }
+
+ /**
+ * Asserts that a bubble notification is not suppressed from the shade and also validates the
+ * cached state is updated.
+ */
+ private void assertBubbleNotificationNotSuppressedFromShade(BubbleEntry entry) {
+ assertFalse(mBubbleController.isBubbleNotificationSuppressedFromShade(
+ entry.getKey(), entry.getGroupKey()));
+ assertFalse(mBubbleController.getImplCachedState().isBubbleNotificationSuppressedFromShade(
+ entry.getKey(), entry.getGroupKey()));
+ }
}