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

Commit 2b4f5428 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB][Notif] Only show 1 status bar notification chip per app.

Fixes: 397442330
Bug: 364653005
Flag: android.app.ui_rich_ongoing

Test: Post 2 colorized notifications from test app -> verify status bar
only shows 1 chip, but shade still shows both notifications. Verify
status bar chip is for the first notif in the shade
Test: Post 2 promoted notifs from different apps -> verify 2 chips
appear
Test: Post promoted notif from same app on two different profiles ->
verify 2 chips appear
Test: atest NotifChipsViewModelTest

Change-Id: I12f56b532378dd53288c0533650e78b7bbfeedcd
parent 89ba44ff
Loading
Loading
Loading
Loading
+185 −0
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import com.android.systemui.statusbar.notification.data.model.activeNotification
import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationsStore
import com.android.systemui.statusbar.notification.data.repository.UnconfinedFakeHeadsUpRowRepository
import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
import com.android.systemui.statusbar.notification.data.repository.addNotif
import com.android.systemui.statusbar.notification.headsup.PinnedStatus
import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi
import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentBuilder
@@ -232,16 +233,19 @@ class NotifChipsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "notif1",
                        packageName = "notif1",
                        statusBarChipIcon = firstIcon,
                        promotedContent = PromotedNotificationContentBuilder("notif1").build(),
                    ),
                    activeNotificationModel(
                        key = "notif2",
                        packageName = "notif2",
                        statusBarChipIcon = secondIcon,
                        promotedContent = PromotedNotificationContentBuilder("notif2").build(),
                    ),
                    activeNotificationModel(
                        key = "notif3",
                        packageName = "notif3",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = null,
                    ),
@@ -267,16 +271,19 @@ class NotifChipsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = firstKey,
                        packageName = firstKey,
                        statusBarChipIcon = null,
                        promotedContent = PromotedNotificationContentBuilder(firstKey).build(),
                    ),
                    activeNotificationModel(
                        key = secondKey,
                        packageName = secondKey,
                        statusBarChipIcon = null,
                        promotedContent = PromotedNotificationContentBuilder(secondKey).build(),
                    ),
                    activeNotificationModel(
                        key = thirdKey,
                        packageName = thirdKey,
                        statusBarChipIcon = null,
                        promotedContent = null,
                    ),
@@ -288,6 +295,184 @@ class NotifChipsViewModelTest : SysuiTestCase() {
            assertIsNotifKey(latest!![1], secondKey)
        }

    @Test
    fun chips_twoChips_samePackage_differentUids_bothIncluded() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chips)

            fakeSystemClock.setCurrentTimeMillis(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif1",
                    packageName = "samePackage",
                    uid = 10,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif1").build(),
                )
            )

            fakeSystemClock.advanceTime(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif2",
                    packageName = "samePackage",
                    uid = 20,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif2").build(),
                )
            )

            // Notif added later takes priority
            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
        }

    @Test
    fun chips_twoChips_sameUid_differentPackages_bothIncluded() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chips)

            fakeSystemClock.setCurrentTimeMillis(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif1",
                    packageName = "onePackage",
                    uid = 10,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif1").build(),
                )
            )

            fakeSystemClock.advanceTime(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif2",
                    packageName = "anotherPackage",
                    uid = 10,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif2").build(),
                )
            )

            // Notif added later takes priority
            assertThat(latest!!.map { it.key }).containsExactly("notif2", "notif1").inOrder()
        }

    @Test
    fun chips_twoChips_samePackage_andSameUid_onlyLaterOneIncluded() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chips)

            val uid = 3
            fakeSystemClock.setCurrentTimeMillis(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif1",
                    packageName = "samePackage",
                    uid = 3,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif1").build(),
                )
            )

            fakeSystemClock.advanceTime(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif2",
                    packageName = "samePackage",
                    uid = 3,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif2").build(),
                )
            )

            // Notif added later takes priority
            assertThat(latest!!.map { it.key }).containsExactly("notif2").inOrder()
        }

    @Test
    fun chips_multipleChipsFromMultiplePackagesAndUids_higherPriorityOfEachIncluded() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chips)

            // Two notifs from "firstPackage"
            fakeSystemClock.setCurrentTimeMillis(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "firstPackage.1",
                    packageName = "firstPackage",
                    uid = 1,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("firstPackage.1").build(),
                )
            )

            fakeSystemClock.advanceTime(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "firstPackage.2",
                    packageName = "firstPackage",
                    uid = 1,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("firstPackage.2").build(),
                )
            )

            // Three notifs from "secondPackage"
            fakeSystemClock.advanceTime(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "secondPackage.1",
                    packageName = "secondPackage",
                    uid = 2,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("secondPackage.1").build(),
                )
            )

            fakeSystemClock.advanceTime(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "secondPackage.2",
                    packageName = "secondPackage",
                    uid = 2,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("secondPackage.2").build(),
                )
            )

            fakeSystemClock.advanceTime(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "secondPackage.3",
                    packageName = "secondPackage",
                    uid = 2,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("secondPackage.3").build(),
                )
            )

            fakeSystemClock.advanceTime(1000)
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "secondPackage.andDifferentUid",
                    packageName = "secondPackage",
                    uid = 200,
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent =
                        PromotedNotificationContentBuilder("secondPackage.andDifferentUid").build(),
                )
            )

            // Notifs added later take priority
            assertThat(latest!!.map { it.key })
                .containsExactly(
                    "secondPackage.andDifferentUid",
                    "secondPackage.3",
                    "firstPackage.2",
                )
                .inOrder()
        }

    @Test
    fun chips_notifTimeAndSystemTimeBothUpdated_modelNotRecreated() =
        kosmos.runTest {
+43 −0
Original line number Diff line number Diff line
@@ -437,6 +437,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif",
                    packageName = "notif",
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = promotedContentBuilder.build(),
                )
@@ -813,6 +814,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "notif",
                        packageName = "notif",
                        statusBarChipIcon = icon,
                        promotedContent = PromotedNotificationContentBuilder("notif").build(),
                    )
@@ -837,6 +839,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "notif",
                        packageName = "notif",
                        statusBarChipIcon = icon,
                        promotedContent = PromotedNotificationContentBuilder("notif").build(),
                    )
@@ -863,11 +866,13 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "firstNotif",
                        packageName = "firstNotif",
                        statusBarChipIcon = firstIcon,
                        promotedContent = PromotedNotificationContentBuilder("firstNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "secondNotif",
                        packageName = "secondNotif",
                        statusBarChipIcon = secondIcon,
                        promotedContent = PromotedNotificationContentBuilder("secondNotif").build(),
                    ),
@@ -892,11 +897,13 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "firstNotif",
                        packageName = "firstNotif",
                        statusBarChipIcon = firstIcon,
                        promotedContent = PromotedNotificationContentBuilder("firstNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "secondNotif",
                        packageName = "secondNotif",
                        statusBarChipIcon = secondIcon,
                        promotedContent = PromotedNotificationContentBuilder("secondNotif").build(),
                    ),
@@ -925,16 +932,19 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "firstNotif",
                        packageName = "firstNotif",
                        statusBarChipIcon = firstIcon,
                        promotedContent = PromotedNotificationContentBuilder("firstNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "secondNotif",
                        packageName = "secondNotif",
                        statusBarChipIcon = secondIcon,
                        promotedContent = PromotedNotificationContentBuilder("secondNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "thirdNotif",
                        packageName = "thirdNotif",
                        statusBarChipIcon = thirdIcon,
                        promotedContent = PromotedNotificationContentBuilder("thirdNotif").build(),
                    ),
@@ -961,21 +971,25 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "firstNotif",
                        packageName = "firstNotif",
                        statusBarChipIcon = firstIcon,
                        promotedContent = PromotedNotificationContentBuilder("firstNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "secondNotif",
                        packageName = "secondNotif",
                        statusBarChipIcon = secondIcon,
                        promotedContent = PromotedNotificationContentBuilder("secondNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "thirdNotif",
                        packageName = "thirdNotif",
                        statusBarChipIcon = thirdIcon,
                        promotedContent = PromotedNotificationContentBuilder("thirdNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "fourthNotif",
                        packageName = "fourthNotif",
                        statusBarChipIcon = fourthIcon,
                        promotedContent = PromotedNotificationContentBuilder("fourthNotif").build(),
                    ),
@@ -1003,16 +1017,19 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "firstNotif",
                        packageName = "firstNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("firstNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "secondNotif",
                        packageName = "secondNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("secondNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "thirdNotif",
                        packageName = "thirdNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("thirdNotif").build(),
                    ),
@@ -1033,21 +1050,25 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "firstNotif",
                        packageName = "firstNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("firstNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "secondNotif",
                        packageName = "secondNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("secondNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "thirdNotif",
                        packageName = "thirdNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("thirdNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "fourthNotif",
                        packageName = "fourthNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("fourthNotif").build(),
                    ),
@@ -1068,21 +1089,25 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "firstNotif",
                        packageName = "firstNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("firstNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "secondNotif",
                        packageName = "secondNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("secondNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "thirdNotif",
                        packageName = "thirdNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("thirdNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "fourthNotif",
                        packageName = "fourthNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("fourthNotif").build(),
                    ),
@@ -1115,11 +1140,13 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "firstNotif",
                        packageName = "firstNotif",
                        statusBarChipIcon = firstIcon,
                        promotedContent = PromotedNotificationContentBuilder("firstNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "secondNotif",
                        packageName = "secondNotif",
                        statusBarChipIcon = createStatusBarIconViewOrNull(),
                        promotedContent = PromotedNotificationContentBuilder("secondNotif").build(),
                    ),
@@ -1147,16 +1174,19 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "firstNotif",
                        packageName = "firstNotif",
                        statusBarChipIcon = firstIcon,
                        promotedContent = PromotedNotificationContentBuilder("firstNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "secondNotif",
                        packageName = "secondNotif",
                        statusBarChipIcon = secondIcon,
                        promotedContent = PromotedNotificationContentBuilder("secondNotif").build(),
                    ),
                    activeNotificationModel(
                        key = "thirdNotif",
                        packageName = "thirdNotif",
                        statusBarChipIcon = thirdIcon,
                        promotedContent = PromotedNotificationContentBuilder("thirdNotif").build(),
                    ),
@@ -1209,6 +1239,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif1",
                    packageName = "notif1",
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif1").build(),
                )
@@ -1216,6 +1247,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif2",
                    packageName = "notif2",
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif2").build(),
                )
@@ -1242,6 +1274,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif1",
                    packageName = "notif1",
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif1").build(),
                )
@@ -1249,6 +1282,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif2",
                    packageName = "notif2",
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif2").build(),
                )
@@ -1277,6 +1311,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif1",
                    packageName = "notif1",
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif1").build(),
                )
@@ -1284,6 +1319,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif2",
                    packageName = "notif2",
                    statusBarChipIcon = createStatusBarIconViewOrNull(),
                    promotedContent = PromotedNotificationContentBuilder("notif2").build(),
                )
@@ -1318,6 +1354,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif",
                    packageName = "notif",
                    statusBarChipIcon = notifIcon,
                    promotedContent = PromotedNotificationContentBuilder("notif").build(),
                )
@@ -1329,6 +1366,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif2",
                    packageName = "notif2",
                    statusBarChipIcon = notifIcon2,
                    promotedContent = PromotedNotificationContentBuilder("notif2").build(),
                )
@@ -1354,6 +1392,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "notif",
                        packageName = "notif",
                        statusBarChipIcon = notifIcon,
                        promotedContent = PromotedNotificationContentBuilder("notif").build(),
                    )
@@ -1405,6 +1444,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif",
                    packageName = "notif",
                    statusBarChipIcon = notifIcon,
                    promotedContent = PromotedNotificationContentBuilder("notif").build(),
                )
@@ -1444,6 +1484,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif",
                    packageName = "notif",
                    statusBarChipIcon = notifIcon,
                    promotedContent = PromotedNotificationContentBuilder("notif").build(),
                )
@@ -1522,6 +1563,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
                listOf(
                    activeNotificationModel(
                        key = "notif1",
                        packageName = "notif1",
                        statusBarChipIcon = notif1Icon,
                        promotedContent = PromotedNotificationContentBuilder("notif1").build(),
                    )
@@ -1576,6 +1618,7 @@ class OngoingActivityChipsWithNotifsViewModelTest : SysuiTestCase() {
            activeNotificationListRepository.addNotif(
                activeNotificationModel(
                    key = "notif2",
                    packageName = "notif2",
                    statusBarChipIcon = notif2Icon,
                    promotedContent = PromotedNotificationContentBuilder("notif2").build(),
                )
+2 −0
Original line number Diff line number Diff line
@@ -144,6 +144,8 @@ constructor(
        return NotificationChipModel(
            key = key,
            appName = appName,
            packageName = packageName,
            uid = uid,
            statusBarChipIconView = statusBarChipIconView,
            promotedContent = promotedContent,
            creationTime = creationTime,
+4 −0

File changed.

Preview size limit exceeded, changes collapsed.

+9 −1

File changed.

Preview size limit exceeded, changes collapsed.