Merge "Add logging for media click intent and location" into tm-dev

This commit is contained in:
Beth Thibodeau
2022-04-05 15:12:29 +00:00
committed by Android (Google) Code Review
6 changed files with 96 additions and 4 deletions

View File

@@ -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

View File

@@ -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()));

View File

@@ -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

View File

@@ -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
}

View File

@@ -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)
}
}

View File

@@ -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)