From 60ab53a06d14b6a2df46206f8a6272811c33c7d4 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Thu, 31 Mar 2022 18:34:22 -0400 Subject: [PATCH] Add logging for media click intent and location Log events when - User taps on media control - Carousel changes location (qs, qqs, lockscreen, dream overlay) Test: atest MediaControlPanelTest MediaCarouselControllerTest Change-Id: Ie564622cbf08af4375ec9262566b08b05a4a8d24 --- .../systemui/media/MediaCarouselController.kt | 5 +++ .../systemui/media/MediaControlPanel.java | 2 +- .../systemui/media/MediaHierarchyManager.kt | 7 +++- .../systemui/media/MediaUiEventLogger.kt | 34 ++++++++++++++++- .../media/MediaCarouselControllerTest.kt | 37 +++++++++++++++++++ .../systemui/media/MediaControlPanelTest.kt | 15 ++++++++ 6 files changed, 96 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index b93239ba71975..d674b2b85db4a 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -690,6 +690,11 @@ class MediaCarouselController @Inject constructor( startDelay: Long = 0 ) { desiredHostState?.let { + if (this.desiredLocation != desiredLocation) { + // Only log an event when location changes + logger.logCarouselPosition(desiredLocation) + } + // This is a hosting view, let's remeasure our players this.desiredLocation = desiredLocation this.desiredHostState = it diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index 5ead375a10841..fffb30720af61 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -333,7 +333,7 @@ public class MediaControlPanel { mMediaViewHolder.getPlayer().setOnClickListener(v -> { if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return; if (mMediaViewController.isGutsVisible()) return; - + mLogger.logTapContentView(mUid, mPackageName, mInstanceId); logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT); mActivityStarter.postStartActivityDismissingKeyguard(clickIntent, buildLaunchAnimatorController(mMediaViewHolder.getPlayer())); diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt index 3d9f933b3a05b..30771c728e862 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt @@ -1146,7 +1146,10 @@ private val EMPTY_RECT = Rect() @Retention(AnnotationRetention.SOURCE) private annotation class TransformationType -@IntDef(prefix = ["LOCATION_"], value = [MediaHierarchyManager.LOCATION_QS, - MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN]) +@IntDef(prefix = ["LOCATION_"], value = [ + MediaHierarchyManager.LOCATION_QS, + MediaHierarchyManager.LOCATION_QQS, + MediaHierarchyManager.LOCATION_LOCKSCREEN, + MediaHierarchyManager.LOCATION_DREAM_OVERLAY]) @Retention(AnnotationRetention.SOURCE) annotation class MediaLocation diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaUiEventLogger.kt b/packages/SystemUI/src/com/android/systemui/media/MediaUiEventLogger.kt index 862b2797b77c7..0fc58132b4d79 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaUiEventLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaUiEventLogger.kt @@ -134,6 +134,23 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger) fun logOpenOutputSwitcher(uid: Int, packageName: String, instanceId: InstanceId) { logger.logWithInstanceId(MediaUiEvent.OPEN_OUTPUT_SWITCHER, uid, packageName, instanceId) } + + fun logTapContentView(uid: Int, packageName: String, instanceId: InstanceId) { + logger.logWithInstanceId(MediaUiEvent.MEDIA_TAP_CONTENT_VIEW, uid, packageName, instanceId) + } + + fun logCarouselPosition(@MediaLocation location: Int) { + val event = when (location) { + MediaHierarchyManager.LOCATION_QQS -> MediaUiEvent.MEDIA_CAROUSEL_LOCATION_QQS + MediaHierarchyManager.LOCATION_QS -> MediaUiEvent.MEDIA_CAROUSEL_LOCATION_QS + MediaHierarchyManager.LOCATION_LOCKSCREEN -> + MediaUiEvent.MEDIA_CAROUSEL_LOCATION_LOCKSCREEN + MediaHierarchyManager.LOCATION_DREAM_OVERLAY -> + MediaUiEvent.MEDIA_CAROUSEL_LOCATION_DREAM + else -> throw IllegalArgumentException("Unknown media carousel location $location") + } + logger.log(event) + } } enum class MediaUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum { @@ -201,7 +218,22 @@ enum class MediaUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum { ACTION_SEEK(1027), @UiEvent(doc = "The user opened the output switcher from a media control") - OPEN_OUTPUT_SWITCHER(1028); + OPEN_OUTPUT_SWITCHER(1028), + + @UiEvent(doc = "The user tapped on a media control view") + MEDIA_TAP_CONTENT_VIEW(1036), + + @UiEvent(doc = "The media carousel moved to QQS") + MEDIA_CAROUSEL_LOCATION_QQS(1037), + + @UiEvent(doc = "THe media carousel moved to QS") + MEDIA_CAROUSEL_LOCATION_QS(1038), + + @UiEvent(doc = "The media carousel moved to the lockscreen") + MEDIA_CAROUSEL_LOCATION_LOCKSCREEN(1039), + + @UiEvent(doc = "The media carousel moved to the dream state") + MEDIA_CAROUSEL_LOCATION_DREAM(1040); override fun getId() = metricId } \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt index 26296d67c71a4..67fe0445e225f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt @@ -52,6 +52,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { @Mock lateinit var panel: MediaControlPanel @Mock lateinit var visualStabilityProvider: VisualStabilityProvider @Mock lateinit var mediaHostStatesManager: MediaHostStatesManager + @Mock lateinit var mediaHostState: MediaHostState @Mock lateinit var activityStarter: ActivityStarter @Mock @Main private lateinit var executor: DelayableExecutor @Mock lateinit var mediaDataManager: MediaDataManager @@ -188,4 +189,40 @@ class MediaCarouselControllerTest : SysuiTestCase() { verify(logger).logCarouselSettings() } + + @Test + fun testLocationChangeQs_logged() { + mediaCarouselController.onDesiredLocationChanged( + MediaHierarchyManager.LOCATION_QS, + mediaHostState, + animate = false) + verify(logger).logCarouselPosition(MediaHierarchyManager.LOCATION_QS) + } + + @Test + fun testLocationChangeQqs_logged() { + mediaCarouselController.onDesiredLocationChanged( + MediaHierarchyManager.LOCATION_QQS, + mediaHostState, + animate = false) + verify(logger).logCarouselPosition(MediaHierarchyManager.LOCATION_QQS) + } + + @Test + fun testLocationChangeLockscreen_logged() { + mediaCarouselController.onDesiredLocationChanged( + MediaHierarchyManager.LOCATION_LOCKSCREEN, + mediaHostState, + animate = false) + verify(logger).logCarouselPosition(MediaHierarchyManager.LOCATION_LOCKSCREEN) + } + + @Test + fun testLocationChangeDream_logged() { + mediaCarouselController.onDesiredLocationChanged( + MediaHierarchyManager.LOCATION_DREAM_OVERLAY, + mediaHostState, + animate = false) + verify(logger).logCarouselPosition(MediaHierarchyManager.LOCATION_DREAM_OVERLAY) + } } \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt index f2e3edbc0761d..91167161ac750 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -16,6 +16,7 @@ package com.android.systemui.media +import android.app.PendingIntent import org.mockito.Mockito.`when` as whenever import android.content.Intent import android.graphics.Color @@ -748,6 +749,20 @@ public class MediaControlPanelTest : SysuiTestCase() { verify(logger).logOpenOutputSwitcher(anyInt(), eq(PACKAGE), eq(instanceId)) } + @Test + fun tapContentView_isLogged() { + val pendingIntent = mock(PendingIntent::class.java) + val captor = ArgumentCaptor.forClass(View.OnClickListener::class.java) + val data = mediaData.copy(clickIntent = pendingIntent) + player.attachPlayer(viewHolder) + player.bindPlayer(data, KEY) + verify(viewHolder.player).setOnClickListener(captor.capture()) + + captor.value.onClick(viewHolder.player) + + verify(logger).logTapContentView(anyInt(), eq(PACKAGE), eq(instanceId)) + } + @Test fun logSeek() { player.attachPlayer(viewHolder)