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

Commit ce9747fa authored by Ahmed Mehfooz's avatar Ahmed Mehfooz Committed by Android (Google) Code Review
Browse files

Merge "Add clickBehavior for CallChipViewModel" into main

parents ef4d2a0c 25de3002
Loading
Loading
Loading
Loading
+102 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.Expandable
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.kosmos.Kosmos
@@ -35,7 +36,14 @@ import com.android.systemui.statusbar.chips.ui.model.ColorsModel
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.data.model.activeNotificationModel
import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationListRepository
import com.android.systemui.statusbar.notification.data.repository.ActiveNotificationsStore
import com.android.systemui.statusbar.notification.data.repository.activeNotificationListRepository
import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel
import com.android.systemui.statusbar.notification.shared.CallType
import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
import com.android.systemui.statusbar.phone.ongoingcall.data.repository.ongoingCallRepository
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.inCallModel
@@ -44,6 +52,7 @@ import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
import kotlinx.coroutines.test.runTest
import org.junit.runner.RunWith
import org.mockito.kotlin.any
import org.mockito.kotlin.mock
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@@ -52,6 +61,7 @@ import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
class CallChipViewModelTest : SysuiTestCase() {
    private val kosmos = Kosmos()
    private val notificationListRepository = kosmos.activeNotificationListRepository
    private val testScope = kosmos.testScope
    private val repo = kosmos.ongoingCallRepository

@@ -65,6 +75,8 @@ class CallChipViewModelTest : SysuiTestCase() {
                )
                .thenReturn(chipBackgroundView)
        }
    private val mockExpandable: Expandable =
        mock<Expandable>().apply { whenever(dialogTransitionController(any())).thenReturn(mock()) }

    private val underTest by lazy { kosmos.callChipViewModel }

@@ -337,6 +349,7 @@ class CallChipViewModelTest : SysuiTestCase() {
        }

    @Test
    @DisableFlags(StatusBarChipsModernization.FLAG_NAME)
    fun chip_inCall_nullIntent_nullClickListener() =
        testScope.runTest {
            val latest by collectLastValue(underTest.chip)
@@ -347,6 +360,7 @@ class CallChipViewModelTest : SysuiTestCase() {
        }

    @Test
    @DisableFlags(StatusBarChipsModernization.FLAG_NAME)
    fun chip_inCall_positiveStartTime_validIntent_clickListenerLaunchesIntent() =
        testScope.runTest {
            val latest by collectLastValue(underTest.chip)
@@ -364,6 +378,7 @@ class CallChipViewModelTest : SysuiTestCase() {
        }

    @Test
    @DisableFlags(StatusBarChipsModernization.FLAG_NAME)
    fun chip_inCall_zeroStartTime_validIntent_clickListenerLaunchesIntent() =
        testScope.runTest {
            val latest by collectLastValue(underTest.chip)
@@ -381,6 +396,72 @@ class CallChipViewModelTest : SysuiTestCase() {
            verify(kosmos.activityStarter).postStartActivityDismissingKeyguard(pendingIntent, null)
        }

    @Test
    @EnableFlags(StatusBarRootModernization.FLAG_NAME, StatusBarChipsModernization.FLAG_NAME)
    fun chip_inCall_nullIntent_noneClickBehavior() =
        testScope.runTest {
            val latest by collectLastValue(underTest.chip)

            postOngoingCallNotification(
                repository = notificationListRepository,
                startTimeMs = 1000L,
                intent = null,
            )

            assertThat((latest as OngoingActivityChipModel.Shown).clickBehavior)
                .isInstanceOf(OngoingActivityChipModel.ClickBehavior.None::class.java)
        }

    @Test
    @EnableFlags(StatusBarRootModernization.FLAG_NAME, StatusBarChipsModernization.FLAG_NAME)
    fun chip_inCall_positiveStartTime_validIntent_clickBehaviorLaunchesIntent() =
        testScope.runTest {
            val latest by collectLastValue(underTest.chip)

            val pendingIntent = mock<PendingIntent>()
            postOngoingCallNotification(
                repository = notificationListRepository,
                startTimeMs = 1000L,
                intent = pendingIntent,
            )

            val clickBehavior = (latest as OngoingActivityChipModel.Shown).clickBehavior
            assertThat(clickBehavior)
                .isInstanceOf(OngoingActivityChipModel.ClickBehavior.ExpandAction::class.java)
            (clickBehavior as OngoingActivityChipModel.ClickBehavior.ExpandAction).onClick(
                mockExpandable
            )

            // Ensure that the SysUI didn't modify the notification's intent by verifying it
            // directly matches the `PendingIntent` set -- see b/212467440.
            verify(kosmos.activityStarter).postStartActivityDismissingKeyguard(pendingIntent, null)
        }

    @Test
    @EnableFlags(StatusBarRootModernization.FLAG_NAME, StatusBarChipsModernization.FLAG_NAME)
    fun chip_inCall_zeroStartTime_validIntent_clickBehaviorLaunchesIntent() =
        testScope.runTest {
            val latest by collectLastValue(underTest.chip)

            val pendingIntent = mock<PendingIntent>()
            postOngoingCallNotification(
                repository = notificationListRepository,
                startTimeMs = 0L,
                intent = pendingIntent,
            )

            val clickBehavior = (latest as OngoingActivityChipModel.Shown).clickBehavior
            assertThat(clickBehavior)
                .isInstanceOf(OngoingActivityChipModel.ClickBehavior.ExpandAction::class.java)
            (clickBehavior as OngoingActivityChipModel.ClickBehavior.ExpandAction).onClick(
                mockExpandable
            )

            // Ensure that the SysUI didn't modify the notification's intent by verifying it
            // directly matches the `PendingIntent` set -- see b/212467440.
            verify(kosmos.activityStarter).postStartActivityDismissingKeyguard(pendingIntent, null)
        }

    companion object {
        fun createStatusBarIconViewOrNull(): StatusBarIconView? =
            if (StatusBarConnectedDisplays.isEnabled) {
@@ -389,6 +470,27 @@ class CallChipViewModelTest : SysuiTestCase() {
                mock<StatusBarIconView>()
            }

        fun postOngoingCallNotification(
            repository: ActiveNotificationListRepository,
            startTimeMs: Long,
            intent: PendingIntent?,
        ) {
            repository.activeNotifications.value =
                ActiveNotificationsStore.Builder()
                    .apply {
                        addIndividualNotif(
                            activeNotificationModel(
                                key = "notif1",
                                whenTime = startTimeMs,
                                callType = CallType.Ongoing,
                                statusBarChipIcon = null,
                                contentIntent = intent,
                            )
                        )
                    }
                    .build()
        }

        private val PROMOTED_CONTENT_WITH_COLOR =
            PromotedNotificationContentModel.Builder("notif")
                .apply {
+25 −6
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipViewModel
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.phone.ongoingcall.StatusBarChipsModernization
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
import com.android.systemui.util.time.SystemClock
import javax.inject.Inject
@@ -93,9 +94,7 @@ constructor(
                                icon = icon,
                                colors = colors,
                                onClickListenerLegacy = getOnClickListener(state),
                                // TODO(b/372657935): Add click support for the call chip when
                                // StatusBarChipModernization is enabled.
                                clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
                                clickBehavior = getClickBehavior(state),
                            )
                        } else {
                            val startTimeInElapsedRealtime =
@@ -106,9 +105,7 @@ constructor(
                                colors = colors,
                                startTimeMs = startTimeInElapsedRealtime,
                                onClickListenerLegacy = getOnClickListener(state),
                                // TODO(b/372657935): Add click support for the call chip when
                                // StatusBarChipModernization is enabled.
                                clickBehavior = OngoingActivityChipModel.ClickBehavior.None,
                                clickBehavior = getClickBehavior(state),
                            )
                        }
                    }
@@ -122,6 +119,7 @@ constructor(
        }

        return View.OnClickListener { view ->
            StatusBarChipsModernization.assertInLegacyMode()
            logger.log(TAG, LogLevel.INFO, {}, { "Chip clicked" })
            val backgroundView =
                view.requireViewById<ChipBackgroundContainer>(R.id.ongoing_activity_chip_background)
@@ -136,6 +134,27 @@ constructor(
        }
    }

    private fun getClickBehavior(
        state: OngoingCallModel.InCall
    ): OngoingActivityChipModel.ClickBehavior =
        if (state.intent == null) {
            OngoingActivityChipModel.ClickBehavior.None
        } else {
            OngoingActivityChipModel.ClickBehavior.ExpandAction(
                onClick = { expandable ->
                    StatusBarChipsModernization.assertInNewMode()
                    val animationController =
                        expandable.activityTransitionController(
                            InteractionJankMonitor.CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP
                        )
                    activityStarter.postStartActivityDismissingKeyguard(
                        state.intent,
                        animationController,
                    )
                }
            )
        }

    companion object {
        private val phoneIcon =
            Icon.Resource(