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

Commit 80e1b6b1 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB][Notif] Show shortCriticalText in notification chip if available.

Bug: 364653005
Flag: com.android.systemui.status_bar_notification_chips
Test: Trigger RON with shortCriticalText set -> chip shows text
Test: Trigger RON without shortCriticalText -> chip shows `when` time
Test: atest NotifChipsViewModelTest
Change-Id: I3bc2a4f32d41143a4f5915ffc4c4b00c18735fe0
parent cdbccfa3
Loading
Loading
Loading
Loading
+31 −2
Original line number Diff line number Diff line
@@ -116,7 +116,7 @@ class NotifChipsViewModelTest : SysuiTestCase() {

            assertThat(latest).hasSize(1)
            val chip = latest!![0]
            assertThat(chip).isInstanceOf(OngoingActivityChipModel.Shown.ShortTimeDelta::class.java)
            assertThat(chip).isInstanceOf(OngoingActivityChipModel.Shown::class.java)
            assertThat(chip.icon).isEqualTo(OngoingActivityChipModel.ChipIcon.StatusBarView(icon))
        }

@@ -139,7 +139,7 @@ class NotifChipsViewModelTest : SysuiTestCase() {

            assertThat(latest).hasSize(1)
            val chip = latest!![0]
            assertThat(chip).isInstanceOf(OngoingActivityChipModel.Shown.ShortTimeDelta::class.java)
            assertThat(chip).isInstanceOf(OngoingActivityChipModel.Shown::class.java)
            assertThat(chip.icon)
                .isEqualTo(OngoingActivityChipModel.ChipIcon.StatusBarNotificationIcon(notifKey))
        }
@@ -241,6 +241,35 @@ class NotifChipsViewModelTest : SysuiTestCase() {
            assertIsNotifKey(latest!![1], secondKey)
        }

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

            val promotedContentBuilder =
                PromotedNotificationContentModel.Builder("notif").apply {
                    this.shortCriticalText = "Arrived"
                    this.time =
                        PromotedNotificationContentModel.When(
                            time = 6543L,
                            mode = PromotedNotificationContentModel.When.Mode.BasicTime,
                        )
                }
            setNotifs(
                listOf(
                    activeNotificationModel(
                        key = "notif",
                        statusBarChipIcon = mock<StatusBarIconView>(),
                        promotedContent = promotedContentBuilder.build(),
                    )
                )
            )

            assertThat(latest).hasSize(1)
            assertThat(latest!![0]).isInstanceOf(OngoingActivityChipModel.Shown.Text::class.java)
            assertThat((latest!![0] as OngoingActivityChipModel.Shown.Text).text)
                .isEqualTo("Arrived")
        }

    @Test
    fun chips_noTime_isIconOnly() =
+48 −0
Original line number Diff line number Diff line
@@ -101,6 +101,7 @@ class PromotedNotificationContentExtractorTest : SysuiTestCase() {
                    setSubText(TEST_SUB_TEXT)
                    setContentTitle(TEST_CONTENT_TITLE)
                    setContentText(TEST_CONTENT_TEXT)
                    setShortCriticalText(TEST_SHORT_CRITICAL_TEXT)
                }
                .also { provider.promotedEntries.add(it) }

@@ -112,6 +113,52 @@ class PromotedNotificationContentExtractorTest : SysuiTestCase() {
        assertThat(content?.text).isEqualTo(TEST_CONTENT_TEXT)
    }

    @Test
    @EnableFlags(PromotedNotificationUi.FLAG_NAME, StatusBarNotifChips.FLAG_NAME)
    @DisableFlags(android.app.Flags.FLAG_API_RICH_ONGOING)
    fun extractContent_apiFlagOff_shortCriticalTextNotExtracted() {
        val entry =
            createEntry { setShortCriticalText(TEST_SHORT_CRITICAL_TEXT) }
                .also { provider.promotedEntries.add(it) }

        val content = extractContent(entry)

        assertThat(content).isNotNull()
        assertThat(content?.text).isNull()
    }

    @Test
    @EnableFlags(
        PromotedNotificationUi.FLAG_NAME,
        StatusBarNotifChips.FLAG_NAME,
        android.app.Flags.FLAG_API_RICH_ONGOING,
    )
    fun extractContent_apiFlagOn_shortCriticalTextExtracted() {
        val entry =
            createEntry { setShortCriticalText(TEST_SHORT_CRITICAL_TEXT) }
                .also { provider.promotedEntries.add(it) }

        val content = extractContent(entry)

        assertThat(content).isNotNull()
        assertThat(content?.shortCriticalText).isEqualTo(TEST_SHORT_CRITICAL_TEXT)
    }

    @Test
    @EnableFlags(
        PromotedNotificationUi.FLAG_NAME,
        StatusBarNotifChips.FLAG_NAME,
        android.app.Flags.FLAG_API_RICH_ONGOING,
    )
    fun extractContent_noShortCriticalTextSet_textIsNull() {
        val entry = createEntry {}.also { provider.promotedEntries.add(it) }

        val content = extractContent(entry)

        assertThat(content).isNotNull()
        assertThat(content?.shortCriticalText).isNull()
    }

    @Test
    @EnableFlags(PromotedNotificationUi.FLAG_NAME, StatusBarNotifChips.FLAG_NAME)
    fun extractContent_fromBigPictureStyle() {
@@ -201,6 +248,7 @@ class PromotedNotificationContentExtractorTest : SysuiTestCase() {
        private const val TEST_SUB_TEXT = "sub text"
        private const val TEST_CONTENT_TITLE = "content title"
        private const val TEST_CONTENT_TEXT = "content text"
        private const val TEST_SHORT_CRITICAL_TEXT = "short"

        private const val TEST_PERSON_NAME = "person name"
        private const val TEST_PERSON_KEY = "person key"
+9 −1
Original line number Diff line number Diff line
@@ -90,6 +90,15 @@ constructor(
            return OngoingActivityChipModel.Shown.IconOnly(icon, colors, onClickListener)
        }

        if (this.promotedContent.shortCriticalText != null) {
            return OngoingActivityChipModel.Shown.Text(
                icon,
                colors,
                this.promotedContent.shortCriticalText,
                onClickListener,
            )
        }

        if (this.promotedContent.time == null) {
            return OngoingActivityChipModel.Shown.IconOnly(icon, colors, onClickListener)
        }
@@ -120,6 +129,5 @@ constructor(
                )
            }
        }
        // TODO(b/364653005): If Notification.shortCriticalText is set, use that instead of `when`.
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -116,7 +116,8 @@ sealed class OngoingActivityChipModel {
            override val colors: ColorsModel,
            // TODO(b/361346412): Enforce a max length requirement?
            val text: String,
        ) : Shown(icon, colors, onClickListener = null) {
            override val onClickListener: View.OnClickListener? = null,
        ) : Shown(icon, colors, onClickListener) {
            override val logName = "Shown.Text"
        }
    }
+8 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ constructor(
        contentBuilder.appName = notification.loadHeaderAppName(context)
        contentBuilder.subText = notification.subText()
        contentBuilder.time = notification.extractWhen()
        contentBuilder.shortCriticalText = notification.shortCriticalText()
        contentBuilder.lastAudiblyAlertedMs = entry.lastAudiblyAlertedMs
        contentBuilder.profileBadgeResId = null // TODO
        contentBuilder.title = notification.title()
@@ -97,6 +98,13 @@ private fun Notification.text(): CharSequence? = extras?.getCharSequence(EXTRA_T

private fun Notification.subText(): String? = extras?.getString(EXTRA_SUB_TEXT)

private fun Notification.shortCriticalText(): String? {
    if (!android.app.Flags.apiRichOngoing()) {
        return null
    }
    return this.shortCriticalText
}

private fun Notification.chronometerCountDown(): Boolean =
    extras?.getBoolean(EXTRA_CHRONOMETER_COUNT_DOWN, /* defaultValue= */ false) ?: false

Loading