Merge "Add logging for media click intent and location" into tm-dev am: ff3b96f401
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/17530331 Change-Id: I8bde16b5cb067e4814a38e899dcf815112e45917 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -690,6 +690,11 @@ class MediaCarouselController @Inject constructor(
|
|||||||
startDelay: Long = 0
|
startDelay: Long = 0
|
||||||
) {
|
) {
|
||||||
desiredHostState?.let {
|
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 is a hosting view, let's remeasure our players
|
||||||
this.desiredLocation = desiredLocation
|
this.desiredLocation = desiredLocation
|
||||||
this.desiredHostState = it
|
this.desiredHostState = it
|
||||||
|
|||||||
@@ -333,7 +333,7 @@ public class MediaControlPanel {
|
|||||||
mMediaViewHolder.getPlayer().setOnClickListener(v -> {
|
mMediaViewHolder.getPlayer().setOnClickListener(v -> {
|
||||||
if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return;
|
if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return;
|
||||||
if (mMediaViewController.isGutsVisible()) return;
|
if (mMediaViewController.isGutsVisible()) return;
|
||||||
|
mLogger.logTapContentView(mUid, mPackageName, mInstanceId);
|
||||||
logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT);
|
logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT);
|
||||||
mActivityStarter.postStartActivityDismissingKeyguard(clickIntent,
|
mActivityStarter.postStartActivityDismissingKeyguard(clickIntent,
|
||||||
buildLaunchAnimatorController(mMediaViewHolder.getPlayer()));
|
buildLaunchAnimatorController(mMediaViewHolder.getPlayer()));
|
||||||
|
|||||||
@@ -1146,7 +1146,10 @@ private val EMPTY_RECT = Rect()
|
|||||||
@Retention(AnnotationRetention.SOURCE)
|
@Retention(AnnotationRetention.SOURCE)
|
||||||
private annotation class TransformationType
|
private annotation class TransformationType
|
||||||
|
|
||||||
@IntDef(prefix = ["LOCATION_"], value = [MediaHierarchyManager.LOCATION_QS,
|
@IntDef(prefix = ["LOCATION_"], value = [
|
||||||
MediaHierarchyManager.LOCATION_QQS, MediaHierarchyManager.LOCATION_LOCKSCREEN])
|
MediaHierarchyManager.LOCATION_QS,
|
||||||
|
MediaHierarchyManager.LOCATION_QQS,
|
||||||
|
MediaHierarchyManager.LOCATION_LOCKSCREEN,
|
||||||
|
MediaHierarchyManager.LOCATION_DREAM_OVERLAY])
|
||||||
@Retention(AnnotationRetention.SOURCE)
|
@Retention(AnnotationRetention.SOURCE)
|
||||||
annotation class MediaLocation
|
annotation class MediaLocation
|
||||||
|
|||||||
@@ -134,6 +134,23 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
|
|||||||
fun logOpenOutputSwitcher(uid: Int, packageName: String, instanceId: InstanceId) {
|
fun logOpenOutputSwitcher(uid: Int, packageName: String, instanceId: InstanceId) {
|
||||||
logger.logWithInstanceId(MediaUiEvent.OPEN_OUTPUT_SWITCHER, uid, packageName, 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 {
|
enum class MediaUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum {
|
||||||
@@ -201,7 +218,22 @@ enum class MediaUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum {
|
|||||||
ACTION_SEEK(1027),
|
ACTION_SEEK(1027),
|
||||||
|
|
||||||
@UiEvent(doc = "The user opened the output switcher from a media control")
|
@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
|
override fun getId() = metricId
|
||||||
}
|
}
|
||||||
@@ -52,6 +52,7 @@ class MediaCarouselControllerTest : SysuiTestCase() {
|
|||||||
@Mock lateinit var panel: MediaControlPanel
|
@Mock lateinit var panel: MediaControlPanel
|
||||||
@Mock lateinit var visualStabilityProvider: VisualStabilityProvider
|
@Mock lateinit var visualStabilityProvider: VisualStabilityProvider
|
||||||
@Mock lateinit var mediaHostStatesManager: MediaHostStatesManager
|
@Mock lateinit var mediaHostStatesManager: MediaHostStatesManager
|
||||||
|
@Mock lateinit var mediaHostState: MediaHostState
|
||||||
@Mock lateinit var activityStarter: ActivityStarter
|
@Mock lateinit var activityStarter: ActivityStarter
|
||||||
@Mock @Main private lateinit var executor: DelayableExecutor
|
@Mock @Main private lateinit var executor: DelayableExecutor
|
||||||
@Mock lateinit var mediaDataManager: MediaDataManager
|
@Mock lateinit var mediaDataManager: MediaDataManager
|
||||||
@@ -188,4 +189,40 @@ class MediaCarouselControllerTest : SysuiTestCase() {
|
|||||||
|
|
||||||
verify(logger).logCarouselSettings()
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.android.systemui.media
|
package com.android.systemui.media
|
||||||
|
|
||||||
|
import android.app.PendingIntent
|
||||||
import org.mockito.Mockito.`when` as whenever
|
import org.mockito.Mockito.`when` as whenever
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
@@ -748,6 +749,20 @@ public class MediaControlPanelTest : SysuiTestCase() {
|
|||||||
verify(logger).logOpenOutputSwitcher(anyInt(), eq(PACKAGE), eq(instanceId))
|
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
|
@Test
|
||||||
fun logSeek() {
|
fun logSeek() {
|
||||||
player.attachPlayer(viewHolder)
|
player.attachPlayer(viewHolder)
|
||||||
|
|||||||
Reference in New Issue
Block a user