diff options
7 files changed, 87 insertions, 46 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java index 4fc347a09292..aedbd1b56622 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationEntry.java @@ -158,13 +158,6 @@ public final class NotificationEntry extends ListEntry { private long initializationTime = -1; /** - * Whether or not this row represents a system notification. Note that if this is - * {@code null}, that means we were either unable to retrieve the info or have yet to - * retrieve the info. - */ - public Boolean mIsSystemNotification; - - /** * Has the user sent a reply through this Notification. */ private boolean hasSentReply; @@ -777,12 +770,28 @@ public final class NotificationEntry extends ListEntry { if (mSbn.getNotification().isMediaNotification()) { return true; } - if (mIsSystemNotification != null && mIsSystemNotification) { + if (!isBlockable()) { return true; } return false; } + /** + * Returns whether this row is considered blockable (i.e. it's not a system notif + * or is not in an allowList). + */ + public boolean isBlockable() { + if (getChannel() == null) { + return false; + } + if (getChannel().isImportanceLockedByCriticalDeviceFunction() + && !getChannel().isBlockable()) { + return false; + } + + return true; + } + private boolean shouldSuppressVisualEffect(int effect) { if (isExemptFromDndVisualSuppression()) { return false; @@ -858,15 +867,6 @@ public final class NotificationEntry extends ListEntry { } /** - * Whether or not this row represents a system notification. Note that if this is - * {@code null}, that means we were either unable to retrieve the info or have yet to - * retrieve the info. - */ - public Boolean isSystemNotification() { - return mIsSystemNotification; - } - - /** * Set this notification to be sensitive. * * @param sensitive true if the content of this notification is sensitive right now diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 7c206eb8a54e..eb496abad460 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -513,16 +513,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView * or is in an allowList). */ public boolean getIsNonblockable() { - if (mEntry == null || mEntry.getChannel() == null) { - Log.w(TAG, "missing entry or channel"); + if (mEntry == null) { return true; } - if (mEntry.getChannel().isImportanceLockedByCriticalDeviceFunction() - && !mEntry.getChannel().isBlockable()) { - return true; - } - - return false; + return !mEntry.isBlockable(); } private boolean isConversation() { @@ -1669,6 +1663,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } + @VisibleForTesting + protected void setEntry(NotificationEntry entry) { + mEntry = entry; + } + private final Runnable mExpireRecentlyAlertedFlag = () -> applyAudiblyAlertedRecently(false); private void applyAudiblyAlertedRecently(boolean audiblyAlertedRecently) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java index 5804ad425267..769143ddbc0d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationEntryTest.java @@ -29,6 +29,7 @@ import static com.android.systemui.statusbar.NotificationEntryHelper.modifySbn; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import android.app.ActivityManager; @@ -57,6 +58,7 @@ import com.android.systemui.util.time.FakeSystemClock; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; import java.util.ArrayList; @@ -72,6 +74,7 @@ public class NotificationEntryTest extends SysuiTestCase { private int mId; private NotificationEntry mEntry; + private NotificationChannel mChannel = Mockito.mock(NotificationChannel.class); private final FakeSystemClock mClock = new FakeSystemClock(); @Before @@ -85,10 +88,13 @@ public class NotificationEntryTest extends SysuiTestCase { .setPkg(TEST_PACKAGE_NAME) .setOpPkg(TEST_PACKAGE_NAME) .setUid(TEST_UID) + .setChannel(mChannel) .setId(mId++) .setNotification(n.build()) .setUser(new UserHandle(ActivityManager.getCurrentUser())) .build(); + + doReturn(false).when(mChannel).isBlockable(); } @Test @@ -100,6 +106,44 @@ public class NotificationEntryTest extends SysuiTestCase { } @Test + public void testBlockableEntryWhenCritical() { + doReturn(true).when(mChannel).isBlockable(); + + assertTrue(mEntry.isBlockable()); + } + + + @Test + public void testBlockableEntryWhenCriticalAndChannelNotBlockable() { + doReturn(true).when(mChannel).isBlockable(); + doReturn(true).when(mChannel).isImportanceLockedByCriticalDeviceFunction(); + + assertTrue(mEntry.isBlockable()); + } + + @Test + public void testNonBlockableEntryWhenCriticalAndChannelNotBlockable() { + doReturn(false).when(mChannel).isBlockable(); + doReturn(true).when(mChannel).isImportanceLockedByCriticalDeviceFunction(); + + assertFalse(mEntry.isBlockable()); + } + + @Test + public void testBlockableWhenEntryHasNoChannel() { + StatusBarNotification sbn = new SbnBuilder().build(); + Ranking ranking = new RankingBuilder() + .setChannel(null) + .setKey(sbn.getKey()) + .build(); + + NotificationEntry entry = + new NotificationEntry(sbn, ranking, mClock.uptimeMillis()); + + assertFalse(entry.isBlockable()); + } + + @Test public void testIsExemptFromDndVisualSuppression_media() { Notification.Builder n = new Notification.Builder(mContext, "") .setStyle(new Notification.MediaStyle() @@ -117,7 +161,8 @@ public class NotificationEntryTest extends SysuiTestCase { @Test public void testIsExemptFromDndVisualSuppression_system() { - mEntry.mIsSystemNotification = true; + doReturn(true).when(mChannel).isImportanceLockedByCriticalDeviceFunction(); + doReturn(false).when(mChannel).isBlockable(); assertTrue(mEntry.isExemptFromDndVisualSuppression()); assertFalse(mEntry.shouldSuppressAmbient()); @@ -128,7 +173,7 @@ public class NotificationEntryTest extends SysuiTestCase { NotificationEntry entry = new NotificationEntryBuilder() .setUid(UID_NORMAL) .build(); - entry.mIsSystemNotification = true; + doReturn(true).when(mChannel).isImportanceLockedByCriticalDeviceFunction(); modifyRanking(entry).setSuppressedVisualEffects(SUPPRESSED_EFFECT_AMBIENT).build(); modifySbn(entry) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java index f4d8405a796e..15c1cb7b123a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/coordinator/RankingCoordinatorTest.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.notification.collection.coordinator; +import static android.app.NotificationManager.IMPORTANCE_DEFAULT; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_AMBIENT; import static android.app.NotificationManager.Policy.SUPPRESSED_EFFECT_NOTIFICATION_LIST; @@ -30,6 +31,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Notification; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.testing.AndroidTestingRunner; @@ -185,7 +187,7 @@ public class RankingCoordinatorTest extends SysuiTestCase { // WHEN it's not dozing (showing the notification list) when(mStatusBarStateController.isDozing()).thenReturn(false); - + // THEN filter out the notification assertTrue(mCapturedDozingFilter.shouldFilterOut(mEntry, 0)); } @@ -277,6 +279,7 @@ public class RankingCoordinatorTest extends SysuiTestCase { private RankingBuilder getRankingForUnfilteredNotif() { return new RankingBuilder(mEntry.getRanking()) + .setChannel(new NotificationChannel("id", null, IMPORTANCE_DEFAULT)) .setSuppressedVisualEffects(0) .setSuspended(false); } @@ -292,7 +295,7 @@ public class RankingCoordinatorTest extends SysuiTestCase { mEntry.setRanking(new RankingBuilder(mEntry.getRanking()) .setImportance(ambient ? NotificationManager.IMPORTANCE_MIN - : NotificationManager.IMPORTANCE_DEFAULT) + : IMPORTANCE_DEFAULT) .build()); assertEquals(ambient, mEntry.getRanking().isAmbient()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java index 8a2dc263cf36..90627cb0fa78 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/interruption/NotificationInterruptStateProviderImplTest.java @@ -36,6 +36,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Notification; +import android.app.NotificationChannel; import android.app.PendingIntent; import android.content.Intent; import android.graphics.drawable.Icon; @@ -529,6 +530,7 @@ public class NotificationInterruptStateProviderImplTest extends SysuiTestCase { .setPkg("a") .setOpPkg("a") .setTag("a") + .setChannel(new NotificationChannel("a", null, importance)) .setNotification(n) .setImportance(importance) .build(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java index c36737c6724e..b1bf971c52fc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowTest.java @@ -58,6 +58,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.notification.AboveShelfChangedListener; import com.android.systemui.statusbar.notification.FeedbackIcon; import com.android.systemui.statusbar.notification.row.ExpandableView.OnHeightChangedListener; +import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.stack.NotificationChildrenContainer; import org.junit.Assert; @@ -65,6 +66,7 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mockito; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; @@ -412,27 +414,15 @@ public class ExpandableNotificationRowTest extends SysuiTestCase { public void testGetIsNonblockable() throws Exception { ExpandableNotificationRow row = mNotificationTestHelper.createRow(mNotificationTestHelper.createNotification()); - - assertFalse(row.getIsNonblockable()); - } - - @Test - public void testGetIsNonblockable_criticalDeviceFunction() throws Exception { - ExpandableNotificationRow row = - mNotificationTestHelper.createRow(mNotificationTestHelper.createNotification()); - row.getEntry().getChannel().setImportanceLockedByCriticalDeviceFunction(true); - row.getEntry().getChannel().setBlockable(false); + row.setEntry(null); assertTrue(row.getIsNonblockable()); - } - @Test - public void testGetIsNonblockable_criticalDeviceFunction_butBlockable() throws Exception { - ExpandableNotificationRow row = - mNotificationTestHelper.createRow(mNotificationTestHelper.createNotification()); - row.getEntry().getChannel().setImportanceLockedByCriticalDeviceFunction(true); - row.getEntry().getChannel().setBlockable(true); + NotificationEntry entry = mock(NotificationEntry.class); + Mockito.doReturn(false, true).when(entry).isBlockable(); + row.setEntry(entry); + assertTrue(row.getIsNonblockable()); assertFalse(row.getIsNonblockable()); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java index 16f934b5af59..2faff0ced70a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CentralSurfacesImplTest.java @@ -39,6 +39,7 @@ import static org.mockito.Mockito.when; import android.app.IWallpaperManager; import android.app.Notification; +import android.app.NotificationChannel; import android.app.WallpaperManager; import android.app.trust.TrustManager; import android.content.BroadcastReceiver; @@ -718,6 +719,7 @@ public class CentralSurfacesImplTest extends SysuiTestCase { .setPkg("a") .setOpPkg("a") .setTag("a") + .setChannel(new NotificationChannel("id", null, IMPORTANCE_HIGH)) .setNotification(n) .setImportance(IMPORTANCE_HIGH) .setSuppressedVisualEffects(SUPPRESSED_EFFECT_PEEK) |