Merge "Show system notifications when DnD is enabled" into tm-dev

This commit is contained in:
Jay Aliomer
2022-06-09 20:15:37 +00:00
committed by Android (Google) Code Review
7 changed files with 87 additions and 46 deletions

View File

@@ -157,13 +157,6 @@ public final class NotificationEntry extends ListEntry {
// this value will reset when the view is completely removed from the shade (ie: filtered out)
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.
*/
@@ -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;
@@ -857,15 +866,6 @@ public final class NotificationEntry extends ListEntry {
return Objects.equals(n.category, category);
}
/**
* 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.
*

View File

@@ -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) {

View File

@@ -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
@@ -99,6 +105,44 @@ public class NotificationEntryTest extends SysuiTestCase {
assertFalse(mEntry.shouldSuppressAmbient());
}
@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, "")
@@ -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)

View File

@@ -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());
}

View File

@@ -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();

View File

@@ -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());
}

View File

@@ -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)