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

Commit a048d00c authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB][Call] Only show call chip if we have promoted content for it.

Now that Ie063bca8508538dd4515d3f7bf2e284548085040 is submitted,
CallStyle.Ongoing notifications will be marked as promoted notifications
and will get all the same treatment (e.g. an AOD representation and
higher ranking). This also means that if a user bans a particular app
from showing promoted notifications, we should *also* not show the call
chip for that app, even if it did post a CallStyle.Ongoing notification.

Fixes: 402724981
Bug: 364653005
Flag: android.app.ui_rich_ongoing
Test: With ui_rich_ongoing flag on, post a CallStyle.Ongoing
notification then ban that app from showing Live Updates -> verify
status bar chip hides. Un-ban the app -> verify status bar chip shows
again
Test: atest CallChipViewModelTest

Change-Id: I0f7492b7461d8a5c2d065b16cfbca230ec364df0
parent f6a4d285
Loading
Loading
Loading
Loading
+236 −9
Original line number Diff line number Diff line
@@ -45,10 +45,12 @@ import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.core.StatusBarRootModernization
import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi
import com.android.systemui.statusbar.phone.ongoingcall.DisableChipsModernization
import com.android.systemui.statusbar.phone.ongoingcall.EnableChipsModernization
import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallTestHelper.addOngoingCallState
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallTestHelper.callPromotedContentBuilder
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallTestHelper.removeOngoingCallState
import com.android.systemui.testKosmos
import com.android.systemui.util.time.fakeSystemClock
@@ -102,20 +104,27 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            addOngoingCallState(startTimeMs = 0, isAppVisible = false)
            addOngoingCallState(startTimeMs = 0, isAppVisible = false, key = NOTIFICATION_KEY)

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java)
            assertThat((latest as OngoingActivityChipModel.Active).key)
                .startsWith(CallChipViewModel.KEY_PREFIX)
            assertThat((latest as OngoingActivityChipModel.Active).key).contains(NOTIFICATION_KEY)
        }

    @Test
    fun chip_inCall_zeroStartTime_isShownAsIconOnly_withData() =
    @DisableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_inCall_zeroStartTime_promotedFlagOff_hasPromotedContent_isShownAsIconOnly_withData() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceId = InstanceId.fakeInstanceId(10)
            addOngoingCallState(startTimeMs = 0, isAppVisible = false, instanceId = instanceId)
            addOngoingCallState(
                startTimeMs = 0,
                isAppVisible = false,
                instanceId = instanceId,
                promotedContent = callPromotedContentBuilder().build(),
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active.IconOnly::class.java)
            assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse()
@@ -123,6 +132,63 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
            assertThat((latest as OngoingActivityChipModel.Active).instanceId).isEqualTo(instanceId)
        }

    @Test
    @DisableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_inCall_zeroStartTime_promotedFlagOff_noPromotedContent_isShownAsIconOnly_withData() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceId = InstanceId.fakeInstanceId(10)
            addOngoingCallState(
                startTimeMs = 0,
                isAppVisible = false,
                instanceId = instanceId,
                promotedContent = null,
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active.IconOnly::class.java)
            assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse()
            assertThat((latest as OngoingActivityChipModel.Active).isImportantForPrivacy).isFalse()
            assertThat((latest as OngoingActivityChipModel.Active).instanceId).isEqualTo(instanceId)
        }

    @Test
    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_inCall_zeroStartTime_promotedFlagOn_hasPromotedContent_isShownAsIconOnly_withData() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceId = InstanceId.fakeInstanceId(10)
            addOngoingCallState(
                startTimeMs = 0,
                isAppVisible = false,
                instanceId = instanceId,
                promotedContent = callPromotedContentBuilder().build(),
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active.IconOnly::class.java)
            assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse()
            assertThat((latest as OngoingActivityChipModel.Active).isImportantForPrivacy).isFalse()
            assertThat((latest as OngoingActivityChipModel.Active).instanceId).isEqualTo(instanceId)
        }

    @Test
    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_inCall_zeroStartTime_promotedFlagOn_noPromotedContent_isInactive() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceId = InstanceId.fakeInstanceId(10)
            addOngoingCallState(
                startTimeMs = 0,
                isAppVisible = false,
                instanceId = instanceId,
                promotedContent = null,
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Inactive::class.java)
        }

    @Test
    fun chip_inCall_negativeStartTime_isShownAsIconOnly_withData() =
        kosmos.runTest {
@@ -138,12 +204,18 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
        }

    @Test
    fun chip_inCall_positiveStartTime_isShownAsTimer_withData() =
    @DisableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_inCall_positiveStartTime_promotedFlagOff_hasPromotedContent_isShownAsTimer_withData() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceId = InstanceId.fakeInstanceId(10)
            addOngoingCallState(startTimeMs = 345, isAppVisible = false, instanceId = instanceId)
            addOngoingCallState(
                startTimeMs = 345,
                isAppVisible = false,
                instanceId = instanceId,
                promotedContent = callPromotedContentBuilder().build(),
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active.Timer::class.java)
            assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse()
@@ -151,6 +223,118 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
            assertThat((latest as OngoingActivityChipModel.Active).instanceId).isEqualTo(instanceId)
        }

    @Test
    @DisableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_inCall_positiveStartTime_promotedFlagOff_noPromotedContent_isShownAsTimer_withData() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceId = InstanceId.fakeInstanceId(10)
            addOngoingCallState(
                startTimeMs = 345,
                isAppVisible = false,
                instanceId = instanceId,
                promotedContent = null,
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active.Timer::class.java)
            assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse()
            assertThat((latest as OngoingActivityChipModel.Active).isImportantForPrivacy).isFalse()
            assertThat((latest as OngoingActivityChipModel.Active).instanceId).isEqualTo(instanceId)
        }

    @Test
    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_inCall_positiveStartTime_promotedFlagOn_hasPromotedContent_isShownAsTimer_withData() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceId = InstanceId.fakeInstanceId(10)
            addOngoingCallState(
                startTimeMs = 345,
                isAppVisible = false,
                instanceId = instanceId,
                promotedContent = callPromotedContentBuilder().build(),
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active.Timer::class.java)
            assertThat((latest as OngoingActivityChipModel.Active).isHidden).isFalse()
            assertThat((latest as OngoingActivityChipModel.Active).isImportantForPrivacy).isFalse()
            assertThat((latest as OngoingActivityChipModel.Active).instanceId).isEqualTo(instanceId)
        }

    @Test
    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_inCall_positiveStartTime_promotedFlagOn_noPromotedContent_isInactive() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceId = InstanceId.fakeInstanceId(10)
            addOngoingCallState(
                startTimeMs = 345,
                isAppVisible = false,
                instanceId = instanceId,
                promotedContent = null,
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Inactive::class.java)
        }

    @Test
    @EnableChipsModernization
    fun chip_twoCallNotifs_earlierIsUsed() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceIdOld = InstanceId.fakeInstanceId(3)
            addOngoingCallState(
                key = "earlierNotif",
                startTimeMs = 3_000,
                instanceId = instanceIdOld,
                promotedContent = callPromotedContentBuilder("earlierNotif").build(),
            )
            val instanceIdNew = InstanceId.fakeInstanceId(6)
            addOngoingCallState(
                key = "laterNotif",
                startTimeMs = 6_000,
                instanceId = instanceIdNew,
                promotedContent = callPromotedContentBuilder("laterNotif").build(),
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active.Timer::class.java)
            assertThat((latest as OngoingActivityChipModel.Active).key).contains("earlierNotif")
            assertThat((latest as OngoingActivityChipModel.Active).instanceId)
                .isEqualTo(instanceIdOld)
        }

    @Test
    @EnableChipsModernization
    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_twoCallNotifs_earlierHasNoPromotedContent_laterIsUsed() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            val instanceIdOld = InstanceId.fakeInstanceId(3)
            addOngoingCallState(
                key = "earlierNotif",
                startTimeMs = 3_000,
                instanceId = instanceIdOld,
                promotedContent = null,
            )
            val instanceIdNew = InstanceId.fakeInstanceId(6)
            addOngoingCallState(
                key = "laterNotif",
                startTimeMs = 6_000,
                instanceId = instanceIdNew,
                promotedContent = callPromotedContentBuilder("laterNotif").build(),
            )

            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active.Timer::class.java)
            assertThat((latest as OngoingActivityChipModel.Active).key).contains("laterNotif")
            assertThat((latest as OngoingActivityChipModel.Active).instanceId)
                .isEqualTo(instanceIdNew)
        }

    @Test
    @DisableFlags(StatusBarChipsReturnAnimations.FLAG_NAME)
    fun chipLegacy_inCallWithVisibleApp_zeroStartTime_isHiddenAsInactive() =
@@ -364,7 +548,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            addOngoingCallState(startTimeMs = 1000, promotedContent = null)
            addOngoingCallState(startTimeMs = 1000)

            assertThat((latest as OngoingActivityChipModel.Active).colors)
                .isEqualTo(ColorsModel.AccentThemed)
@@ -375,12 +559,56 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            addOngoingCallState(startTimeMs = 0, promotedContent = null)
            addOngoingCallState(startTimeMs = 0)

            assertThat((latest as OngoingActivityChipModel.Active).colors)
                .isEqualTo(ColorsModel.AccentThemed)
        }

    @Test
    @DisableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_promotedFlagOff_promotedContentChanges_isIgnored() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            // WHEN there's promoted content
            addOngoingCallState(promotedContent = callPromotedContentBuilder().build())
            // THEN the chip is active
            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java)

            // WHEN the promoted content is removed
            addOngoingCallState(promotedContent = null)
            // THEN the chip stays active
            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java)

            // WHEN there's promoted content again
            addOngoingCallState(promotedContent = callPromotedContentBuilder().build())
            // THEN the chip is still active
            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java)
        }

    @Test
    @EnableFlags(PromotedNotificationUi.FLAG_NAME)
    fun chip_promotedFlagOn_promotedContentChanges_modelUpdates() =
        kosmos.runTest {
            val latest by collectLastValue(underTest.chip)

            // WHEN there's promoted content
            addOngoingCallState(promotedContent = callPromotedContentBuilder().build())
            // THEN the chip is active
            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java)

            // WHEN the promoted content is removed
            addOngoingCallState(promotedContent = null)
            // THEN the chip is inactive
            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Inactive::class.java)

            // WHEN there's promoted content again
            addOngoingCallState(promotedContent = callPromotedContentBuilder().build())
            // THEN the chip is active again
            assertThat(latest).isInstanceOf(OngoingActivityChipModel.Active::class.java)
        }

    @Test
    fun chip_resetsCorrectly() =
        kosmos.runTest {
@@ -818,8 +1046,6 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {

        private const val NOTIFICATION_KEY = "testKey"
        private const val NOTIFICATION_UID = 12345
        private const val PROMOTED_BACKGROUND_COLOR = 65
        private const val PROMOTED_PRIMARY_TEXT_COLOR = 98

        @get:Parameters(name = "{0}")
        @JvmStatic
@@ -830,6 +1056,7 @@ class CallChipViewModelTest(flags: FlagsParameterization) : SysuiTestCase() {
                        StatusBarRootModernization.FLAG_NAME,
                        StatusBarChipsModernization.FLAG_NAME,
                        StatusBarChipsReturnAnimations.FLAG_NAME,
                        PromotedNotificationUi.FLAG_NAME,
                    )
                )
            }
+1 −1
Original line number Diff line number Diff line
@@ -302,7 +302,7 @@ class ColorizedFgsCoordinatorTest : SysuiTestCase() {
    fun comparatorPutsCallBeforeOther() =
        kosmos.runTest {
            // GIVEN a call and a promoted ongoing notification
            val callEntry = buildOngoingCallEntry(promoted = false)
            val callEntry = buildOngoingCallEntry(promoted = true)
            val ronEntry = buildPromotedOngoingEntry()
            val otherEntry = buildNotificationEntry(tag = "other")

+227 −3

File changed.

Preview size limit exceeded, changes collapsed.

+5 −7
Original line number Diff line number Diff line
@@ -70,9 +70,9 @@ class PromotedNotificationsInteractorTest : SysuiTestCase() {
    }

    @Test
    fun orderedChipNotificationKeys_containsNonPromotedCalls() =
    fun orderedChipNotificationKeys_doesNotContainNonPromotedCalls() =
        kosmos.runTest {
            // GIVEN a call and a promoted ongoing notification
            // GIVEN a non-promoted call and a promoted ongoing notification
            val callEntry = buildOngoingCallEntry(promoted = false)
            val ronEntry = buildPromotedOngoingEntry()
            val otherEntry = buildNotificationEntry(tag = "other")
@@ -84,16 +84,14 @@ class PromotedNotificationsInteractorTest : SysuiTestCase() {
            val orderedChipNotificationKeys by
                collectLastValue(underTest.orderedChipNotificationKeys)

            // THEN the order of the notification keys should be the call then the RON
            assertThat(orderedChipNotificationKeys)
                .containsExactly("0|test_pkg|0|call|0", "0|test_pkg|0|ron|0")
                .inOrder()
            // THEN the call shouldn't be in the list
            assertThat(orderedChipNotificationKeys).containsExactly("0|test_pkg|0|ron|0")
        }

    @Test
    fun orderedChipNotificationKeys_containsPromotedCalls() =
        kosmos.runTest {
            // GIVEN a call and a promoted ongoing notification
            // GIVEN a promoted call and a promoted ongoing notification
            val callEntry = buildOngoingCallEntry(promoted = true)
            val ronEntry = buildPromotedOngoingEntry()
            val otherEntry = buildNotificationEntry(tag = "other")
+2 −1
Original line number Diff line number Diff line
@@ -40,6 +40,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.activeNotificationListRepository
import com.android.systemui.statusbar.notification.domain.interactor.activeNotificationsInteractor
import com.android.systemui.statusbar.notification.promoted.PromotedNotificationUi
import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentBuilder
import com.android.systemui.statusbar.notification.shared.ActiveNotificationModel
import com.android.systemui.statusbar.notification.shared.CallType
@@ -68,7 +69,7 @@ import org.mockito.kotlin.whenever
@SmallTest
@RunWith(AndroidJUnit4::class)
@TestableLooper.RunWithLooper
@DisableFlags(StatusBarChipsModernization.FLAG_NAME)
@DisableFlags(StatusBarChipsModernization.FLAG_NAME, PromotedNotificationUi.FLAG_NAME)
class OngoingCallControllerTest : SysuiTestCase() {
    private val kosmos = testKosmos()

Loading