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

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

[SB][Chip] Add UI events for chip tap.

Bug: 386821418
Bug: 364653005
Flag: com.android.systemui.status_bar_notification_chips
Test: Verify logs using Atom Tester

Change-Id: I165ad54c4d3ae3c884bbf28690266d01d9fe9043
parent 6c3f2222
Loading
Loading
Loading
Loading
+12 −4
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.internal.jank.Cuj
import com.android.internal.logging.InstanceId
import com.android.systemui.SysuiTestCase
import com.android.systemui.animation.DialogCuj
import com.android.systemui.animation.DialogTransitionAnimator
@@ -29,9 +30,11 @@ import com.android.systemui.res.R
import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipViewModel.Companion.createDialogLaunchOnClickCallback
import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipViewModel.Companion.createDialogLaunchOnClickListener
import com.android.systemui.statusbar.chips.uievents.statusBarChipsUiEventLogger
import com.android.systemui.statusbar.phone.SystemUIDialog
import com.android.systemui.statusbar.phone.ongoingcall.DisableChipsModernization
import com.android.systemui.statusbar.phone.ongoingcall.EnableChipsModernization
import com.android.systemui.testKosmos
import kotlin.test.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyBoolean
@@ -44,6 +47,7 @@ import org.mockito.kotlin.whenever
@SmallTest
@RunWith(AndroidJUnit4::class)
class OngoingActivityChipViewModelTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val mockSystemUIDialog = mock<SystemUIDialog>()
    private val dialogDelegate = SystemUIDialog.Delegate { mockSystemUIDialog }
    private val dialogTransitionAnimator = mock<DialogTransitionAnimator>()
@@ -70,8 +74,10 @@ class OngoingActivityChipViewModelTest : SysuiTestCase() {
                dialogDelegate,
                dialogTransitionAnimator,
                cuj,
                logcatLogBuffer("OngoingActivityChipViewModelTest"),
                "tag",
                instanceId = InstanceId.fakeInstanceId(0),
                uiEventLogger = kosmos.statusBarChipsUiEventLogger,
                logger = logcatLogBuffer("OngoingActivityChipViewModelTest"),
                tag = "tag",
            )

        clickListener.onClick(chipView)
@@ -88,8 +94,10 @@ class OngoingActivityChipViewModelTest : SysuiTestCase() {
                dialogDelegate,
                dialogTransitionAnimator,
                cuj,
                logcatLogBuffer("OngoingActivityChipViewModelTest"),
                "tag",
                instanceId = InstanceId.fakeInstanceId(0),
                uiEventLogger = kosmos.statusBarChipsUiEventLogger,
                logger = logcatLogBuffer("OngoingActivityChipViewModelTest"),
                tag = "tag",
            )

        clickCallback.invoke(mockExpandable)
+10 −8
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import com.android.systemui.log.logcatLogBuffer
import com.android.systemui.statusbar.NotificationRemoteInputManager
import com.android.systemui.statusbar.chips.notification.domain.interactor.statusBarNotificationChipsInteractor
import com.android.systemui.statusbar.chips.notification.shared.StatusBarNotifChips
import com.android.systemui.statusbar.chips.uievents.statusBarChipsUiEventLogger
import com.android.systemui.statusbar.notification.NotifPipelineFlags
import com.android.systemui.statusbar.notification.collection.GroupEntryBuilder
import com.android.systemui.statusbar.notification.collection.NotifPipeline
@@ -144,6 +145,7 @@ class HeadsUpCoordinatorTest : SysuiTestCase() {
                launchFullScreenIntentProvider,
                flags,
                statusBarNotificationChipsInteractor,
                kosmos.statusBarChipsUiEventLogger,
                headerController,
                executor,
            )
@@ -164,14 +166,14 @@ class HeadsUpCoordinatorTest : SysuiTestCase() {
            verify(notifPipeline).addOnBeforeFinalizeFilterListener(capture())
        }
        onHeadsUpChangedListener = withArgCaptor { verify(headsUpManager).addListener(capture()) }
        actionPressListener = if (NotificationBundleUi.isEnabled) {
        actionPressListener =
            if (NotificationBundleUi.isEnabled) {
                withArgCaptor {
                verify(kosmos.mockNotificationActionClickManager).addActionClickListener(capture())
                    verify(kosmos.mockNotificationActionClickManager)
                        .addActionClickListener(capture())
                }
            } else {
            withArgCaptor {
                verify(remoteInputManager).addActionPressListener(capture())
            }
                withArgCaptor { verify(remoteInputManager).addActionPressListener(capture()) }
            }
        given(headsUpManager.allEntries).willAnswer { huns.stream() }
        given(headsUpManager.isHeadsUpEntry(anyString())).willAnswer { invocation ->
+26 −8
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.content.ComponentName
import android.content.Context
import android.view.View
import com.android.internal.jank.Cuj
import com.android.internal.logging.InstanceId
import com.android.systemui.animation.ActivityTransitionAnimator
import com.android.systemui.animation.ComposableControllerFactory
import com.android.systemui.animation.DelegateTransitionAnimatorController
@@ -41,6 +42,7 @@ 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.chips.ui.viewmodel.OngoingActivityChipViewModel
import com.android.systemui.statusbar.chips.uievents.StatusBarChipsUiEventLogger
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
@@ -68,6 +70,7 @@ constructor(
    systemClock: SystemClock,
    private val activityStarter: ActivityStarter,
    @StatusBarChipsLog private val logger: LogBuffer,
    private val uiEventLogger: StatusBarChipsUiEventLogger,
) : OngoingActivityChipViewModel {
    /** The transition cookie used to register and unregister launch and return animations. */
    private val cookie =
@@ -199,6 +202,8 @@ constructor(
            }

        val colors = ColorsModel.AccentThemed
        val intent = state.intent
        val instanceId = state.notificationInstanceId

        // This block mimics OngoingCallController#updateChip.
        if (state.startTimeMs <= 0L) {
@@ -208,11 +213,11 @@ constructor(
                key = key,
                icon = icon,
                colors = colors,
                onClickListenerLegacy = getOnClickListener(state.intent),
                clickBehavior = getClickBehavior(state.intent),
                onClickListenerLegacy = getOnClickListener(intent, instanceId),
                clickBehavior = getClickBehavior(intent, instanceId),
                isHidden = isHidden,
                transitionManager = getTransitionManager(state, transitionState),
                instanceId = state.notificationInstanceId,
                instanceId = instanceId,
            )
        } else {
            val startTimeInElapsedRealtime =
@@ -222,20 +227,26 @@ constructor(
                icon = icon,
                colors = colors,
                startTimeMs = startTimeInElapsedRealtime,
                onClickListenerLegacy = getOnClickListener(state.intent),
                clickBehavior = getClickBehavior(state.intent),
                onClickListenerLegacy = getOnClickListener(intent, instanceId),
                clickBehavior = getClickBehavior(intent, instanceId),
                isHidden = isHidden,
                transitionManager = getTransitionManager(state, transitionState),
                instanceId = state.notificationInstanceId,
                instanceId = instanceId,
            )
        }
    }

    private fun getOnClickListener(intent: PendingIntent?): View.OnClickListener? {
    private fun getOnClickListener(
        intent: PendingIntent?,
        instanceId: InstanceId?,
    ): View.OnClickListener? {
        if (intent == null) return null
        return View.OnClickListener { view ->
            StatusBarChipsModernization.assertInLegacyMode()

            logger.log(TAG, LogLevel.INFO, {}, { "Chip clicked" })
            uiEventLogger.logChipTapToShow(instanceId)

            val backgroundView =
                view.requireViewById<ChipBackgroundContainer>(R.id.ongoing_activity_chip_background)
            // This mimics OngoingCallController#updateChipClickListener.
@@ -249,13 +260,20 @@ constructor(
        }
    }

    private fun getClickBehavior(intent: PendingIntent?): OngoingActivityChipModel.ClickBehavior =
    private fun getClickBehavior(
        intent: PendingIntent?,
        instanceId: InstanceId?,
    ): OngoingActivityChipModel.ClickBehavior =
        if (intent == null) {
            OngoingActivityChipModel.ClickBehavior.None
        } else {
            OngoingActivityChipModel.ClickBehavior.ExpandAction(
                onClick = { expandable ->
                    StatusBarChipsModernization.unsafeAssertInNewMode()

                    logger.log(TAG, LogLevel.INFO, {}, { "Chip clicked" })
                    uiEventLogger.logChipTapToShow(instanceId)

                    val animationController =
                        if (
                            !StatusBarChipsReturnAnimations.isEnabled ||
+17 −9
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ constructor(
    private val dialogTransitionAnimator: DialogTransitionAnimator,
    private val endMediaProjectionDialogHelper: EndMediaProjectionDialogHelper,
    @StatusBarChipsLog private val logger: LogBuffer,
    uiEventLogger: StatusBarChipsUiEventLogger,
    private val uiEventLogger: StatusBarChipsUiEventLogger,
) : OngoingActivityChipViewModel {
    // There can only be 1 active cast-to-other-device chip at a time, so we can re-use the ID.
    private val instanceId = uiEventLogger.createNewInstanceId()
@@ -217,8 +217,10 @@ constructor(
                    createCastScreenToOtherDeviceDialogDelegate(state),
                    dialogTransitionAnimator,
                    DIALOG_CUJ,
                    logger,
                    TAG,
                    instanceId = instanceId,
                    uiEventLogger = uiEventLogger,
                    logger = logger,
                    tag = TAG,
                ),
            clickBehavior =
                OngoingActivityChipModel.ClickBehavior.ExpandAction(
@@ -227,8 +229,10 @@ constructor(
                            createCastScreenToOtherDeviceDialogDelegate(state),
                            dialogTransitionAnimator,
                            DIALOG_CUJ,
                            logger,
                            TAG,
                            instanceId = instanceId,
                            uiEventLogger = uiEventLogger,
                            logger = logger,
                            tag = TAG,
                        )
                ),
            instanceId = instanceId,
@@ -253,8 +257,10 @@ constructor(
                    createGenericCastToOtherDeviceDialogDelegate(deviceName),
                    dialogTransitionAnimator,
                    DIALOG_CUJ_AUDIO_ONLY,
                    logger,
                    TAG,
                    instanceId = instanceId,
                    uiEventLogger = uiEventLogger,
                    logger = logger,
                    tag = TAG,
                ),
            clickBehavior =
                OngoingActivityChipModel.ClickBehavior.ExpandAction(
@@ -262,8 +268,10 @@ constructor(
                        createGenericCastToOtherDeviceDialogDelegate(deviceName),
                        dialogTransitionAnimator,
                        DIALOG_CUJ_AUDIO_ONLY,
                        logger,
                        TAG,
                        instanceId = instanceId,
                        uiEventLogger = uiEventLogger,
                        logger = logger,
                        tag = TAG,
                    )
                ),
            instanceId = instanceId,
+9 −5
Original line number Diff line number Diff line
@@ -66,7 +66,7 @@ constructor(
    private val endMediaProjectionDialogHelper: EndMediaProjectionDialogHelper,
    private val dialogTransitionAnimator: DialogTransitionAnimator,
    @StatusBarChipsLog private val logger: LogBuffer,
    uiEventLogger: StatusBarChipsUiEventLogger,
    private val uiEventLogger: StatusBarChipsUiEventLogger,
) : OngoingActivityChipViewModel {
    private val instanceId = uiEventLogger.createNewInstanceId()

@@ -105,8 +105,10 @@ constructor(
                                    createDelegate(state.recordedTask),
                                    dialogTransitionAnimator,
                                    DIALOG_CUJ,
                                    logger,
                                    TAG,
                                    instanceId = instanceId,
                                    uiEventLogger = uiEventLogger,
                                    logger = logger,
                                    tag = TAG,
                                ),
                            clickBehavior =
                                OngoingActivityChipModel.ClickBehavior.ExpandAction(
@@ -114,8 +116,10 @@ constructor(
                                        dialogDelegate = createDelegate(state.recordedTask),
                                        dialogTransitionAnimator = dialogTransitionAnimator,
                                        DIALOG_CUJ,
                                        logger,
                                        TAG,
                                        instanceId = instanceId,
                                        uiEventLogger = uiEventLogger,
                                        logger = logger,
                                        tag = TAG,
                                    )
                                ),
                            instanceId = instanceId,
Loading