From 421c52978258ca58c9ec1706482c8d32538a37d0 Mon Sep 17 00:00:00 2001 From: Steve Elliott Date: Wed, 20 May 2020 08:36:35 -0400 Subject: [PATCH] Uprank colorized FSNs Fixes: 151834960 Test: manual Change-Id: I9408b9a500f3ae4989c16a4951c1783840f3ac42 --- .../collection/NotificationRankingManager.kt | 42 ++++++++------- .../NotificationRankingManagerTest.kt | 54 +++++++++++++++++++ 2 files changed, 76 insertions(+), 20 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt index dc0b802129fcf..bab2686c5c9c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManager.kt @@ -74,11 +74,14 @@ open class NotificationRankingManager @Inject constructor( val aRank = a.ranking.rank val bRank = b.ranking.rank + val aIsFsn = a.isColorizedForegroundService() + val bIsFsn = b.isColorizedForegroundService() + val aPersonType = a.getPeopleNotificationType() val bPersonType = b.getPeopleNotificationType() - val aMedia = isImportantMedia(a) - val bMedia = isImportantMedia(b) + val aMedia = a.isImportantMedia() + val bMedia = b.isImportantMedia() val aSystemMax = a.isSystemMax() val bSystemMax = b.isSystemMax() @@ -92,7 +95,7 @@ open class NotificationRankingManager @Inject constructor( aHeadsUp != bHeadsUp -> if (aHeadsUp) -1 else 1 // Provide consistent ranking with headsUpManager aHeadsUp -> headsUpManager.compare(a, b) - + aIsFsn != bIsFsn -> if (aIsFsn) -1 else 1 usePeopleFiltering && aPersonType != bPersonType -> peopleNotificationIdentifier.compareTo(aPersonType, bPersonType) // Upsort current media notification. @@ -106,11 +109,6 @@ open class NotificationRankingManager @Inject constructor( } } - private fun isImportantMedia(entry: NotificationEntry): Boolean { - val importance = entry.ranking.importance - return entry.key == mediaManager.mediaNotificationKey && importance > IMPORTANCE_MIN - } - fun updateRanking( newRankingMap: RankingMap?, entries: Collection, @@ -153,15 +151,12 @@ open class NotificationRankingManager @Inject constructor( @PriorityBucket private fun getBucketForEntry(entry: NotificationEntry): Int { val isHeadsUp = entry.isRowHeadsUp - val isMedia = isImportantMedia(entry) + val isMedia = entry.isImportantMedia() val isSystemMax = entry.isSystemMax() return when { - entry.sbn.notification.isForegroundService && entry.sbn.notification.isColorized -> - BUCKET_FOREGROUND_SERVICE - usePeopleFiltering && entry.getPeopleNotificationType() != TYPE_NON_PERSON -> - BUCKET_PEOPLE - isHeadsUp || isMedia || isSystemMax || entry.isHighPriority() -> - BUCKET_ALERTING + entry.isColorizedForegroundService() -> BUCKET_FOREGROUND_SERVICE + usePeopleFiltering && entry.isConversation() -> BUCKET_PEOPLE + isHeadsUp || isMedia || isSystemMax || entry.isHighPriority() -> BUCKET_ALERTING else -> BUCKET_SILENT } } @@ -190,6 +185,11 @@ open class NotificationRankingManager @Inject constructor( } } + private fun NotificationEntry.isImportantMedia() = + key == mediaManager.mediaNotificationKey && ranking.importance > IMPORTANCE_MIN + + private fun NotificationEntry.isConversation() = getPeopleNotificationType() != TYPE_NON_PERSON + private fun NotificationEntry.getPeopleNotificationType() = peopleNotificationIdentifier.getPeopleNotificationType(sbn, ranking) @@ -198,10 +198,12 @@ open class NotificationRankingManager @Inject constructor( } // Convenience functions -private fun NotificationEntry.isSystemMax(): Boolean { - return importance >= IMPORTANCE_HIGH && sbn.isSystemNotification() -} +private fun NotificationEntry.isSystemMax() = + importance >= IMPORTANCE_HIGH && sbn.isSystemNotification() -private fun StatusBarNotification.isSystemNotification(): Boolean { - return "android" == packageName || "com.android.systemui" == packageName +private fun StatusBarNotification.isSystemNotification() = + "android" == packageName || "com.android.systemui" == packageName + +private fun NotificationEntry.isColorizedForegroundService() = sbn.notification.run { + isForegroundService && isColorized && importance > IMPORTANCE_MIN } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt index 9f47f4a71ca97..1c47131e2e86c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotificationRankingManagerTest.kt @@ -38,9 +38,11 @@ import com.android.systemui.statusbar.notification.people.PeopleNotificationIden import com.android.systemui.statusbar.notification.people.PeopleNotificationIdentifier.Companion.TYPE_PERSON import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.stack.BUCKET_ALERTING +import com.android.systemui.statusbar.notification.stack.BUCKET_FOREGROUND_SERVICE import com.android.systemui.statusbar.notification.stack.BUCKET_SILENT import com.android.systemui.statusbar.phone.NotificationGroupManager import com.android.systemui.statusbar.policy.HeadsUpManager +import com.google.common.truth.Truth.assertThat import dagger.Lazy import junit.framework.Assert.assertEquals import org.junit.Before @@ -353,6 +355,58 @@ class NotificationRankingManagerTest : SysuiTestCase() { assertEquals(false, e.hasFinishedInitialization()) } + @Test + fun testSort_colorizedForegroundService() { + whenever(sectionsManager.isFilteringEnabled()).thenReturn(true) + + val a = NotificationEntryBuilder() + .setImportance(IMPORTANCE_HIGH) + .setPkg("pkg") + .setOpPkg("pkg") + .setTag("tag") + .setNotification( + Notification.Builder(mContext, "test") + .build()) + .setChannel(NotificationChannel("test", "", IMPORTANCE_DEFAULT)) + .setUser(mContext.getUser()) + .setOverrideGroupKey("") + .build() + + val b = NotificationEntryBuilder() + .setImportance(IMPORTANCE_DEFAULT) // high priority + .setPkg("pkg2") + .setOpPkg("pkg2") + .setTag("tag") + .setNotification(mock(Notification::class.java).also { notif -> + whenever(notif.isForegroundService).thenReturn(true) + whenever(notif.isColorized).thenReturn(true) + }) + .setChannel(NotificationChannel("test", "", IMPORTANCE_DEFAULT)) + .setUser(mContext.getUser()) + .setOverrideGroupKey("") + .build() + + val cN = Notification.Builder(mContext, "test") + .setStyle(Notification.MessagingStyle("")) + .build() + val c = NotificationEntryBuilder() + .setImportance(IMPORTANCE_HIGH) + .setPkg("pkg") + .setOpPkg("pkg") + .setTag("tag") + .setNotification(cN) + .setChannel(NotificationChannel("test", "", IMPORTANCE_DEFAULT)) + .setUser(mContext.user) + .setOverrideGroupKey("") + .build() + whenever(personNotificationIdentifier.getPeopleNotificationType(a.sbn, a.ranking)) + .thenReturn(TYPE_IMPORTANT_PERSON) + + assertThat(rankingManager.updateRanking(null, listOf(a, b, c), "test")) + .containsExactly(b, c, a) + assertThat(b.bucket).isEqualTo(BUCKET_FOREGROUND_SERVICE) + } + internal class TestableNotificationRankingManager( mediaManager: Lazy, groupManager: NotificationGroupManager,