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

Commit e31c8928 authored by Beth Thibodeau's avatar Beth Thibodeau Committed by Android (Google) Code Review
Browse files

Merge changes from topic "presubmit-am-32f14c30420c44f88650ca750b09d4d7" into tm-mainline-prod

* changes:
  [automerge] Add logging for media recommendation events 2p: f000c437
  Add logging for media recommendation events
parents 7b201ec2 780ff30f
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -508,6 +508,11 @@ class MediaCarouselController @Inject constructor(
        dismissMediaData: Boolean = true,
        dismissRecommendation: Boolean = true
    ) {
        if (key == MediaPlayerData.smartspaceMediaKey()) {
            MediaPlayerData.smartspaceMediaData?.let {
                logger.logRecommendationRemoved(it.packageName, it.instanceId)
            }
        }
        val removed = MediaPlayerData.removeMediaPlayer(key)
        removed?.apply {
            mediaCarouselScrollHandler.onPrePlayerRemoved(removed)
+9 −0
Original line number Diff line number Diff line
@@ -331,6 +331,7 @@ public class MediaControlPanel {
        });
        mRecommendationViewHolder.getSettings().setOnClickListener(v -> {
            if (!mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) {
                mLogger.logLongPressSettings(mUid, mPackageName, mInstanceId);
                mActivityStarter.startActivity(SETTINGS_INTENT, true /* dismissShade */);
            }
        });
@@ -940,6 +941,8 @@ public class MediaControlPanel {

        mSmartspaceId = SmallHash.hash(data.getTargetId());
        mBackgroundColor = data.getBackgroundColor();
        mPackageName = data.getPackageName();
        mInstanceId = data.getInstanceId();
        TransitionLayout recommendationCard = mRecommendationViewHolder.getRecommendations();
        recommendationCard.setBackgroundTintList(ColorStateList.valueOf(mBackgroundColor));

@@ -1068,6 +1071,7 @@ public class MediaControlPanel {
        mRecommendationViewHolder.getDismiss().setOnClickListener(v -> {
            if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return;

            mLogger.logLongPressDismiss(mUid, mPackageName, mInstanceId);
            logSmartspaceCardReported(
                    761 // SMARTSPACE_CARD_DISMISS
            );
@@ -1204,6 +1208,11 @@ public class MediaControlPanel {
        view.setOnClickListener(v -> {
            if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return;

            if (interactedSubcardRank == -1) {
                mLogger.logRecommendationCardTap(mPackageName, mInstanceId);
            } else {
                mLogger.logRecommendationItemTap(mPackageName, mInstanceId, interactedSubcardRank);
            }
            logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT,
                    interactedSubcardRank,
                    getSmartspaceSubCardCardinality());
+14 −4
Original line number Diff line number Diff line
@@ -60,7 +60,8 @@ class MediaDataFilter @Inject constructor(
    private val broadcastSender: BroadcastSender,
    private val lockscreenUserManager: NotificationLockscreenUserManager,
    @Main private val executor: Executor,
    private val systemClock: SystemClock
    private val systemClock: SystemClock,
    private val logger: MediaUiEventLogger
) : MediaDataManager.Listener {
    private val userTracker: CurrentUserTracker
    private val _listeners: MutableSet<MediaDataManager.Listener> = mutableSetOf()
@@ -151,6 +152,8 @@ class MediaDataFilter @Inject constructor(
                Log.d(TAG, "reactivating $lastActiveKey instead of smartspace")
                reactivatedKey = lastActiveKey
                val mediaData = sorted.get(lastActiveKey)!!.copy(active = true)
                logger.logRecommendationActivated(mediaData.appUid, mediaData.packageName,
                    mediaData.instanceId)
                listeners.forEach {
                    it.onMediaDataLoaded(lastActiveKey, lastActiveKey, mediaData,
                            receivedSmartspaceCardLatency =
@@ -167,6 +170,8 @@ class MediaDataFilter @Inject constructor(
            Log.d(TAG, "Invalid recommendation data. Skip showing the rec card")
            return
        }
        logger.logRecommendationAdded(smartspaceMediaData.packageName,
            smartspaceMediaData.instanceId)
        listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data, shouldPrioritizeMutable) }
    }

@@ -197,7 +202,9 @@ class MediaDataFilter @Inject constructor(

        if (smartspaceMediaData.isActive) {
            smartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA.copy(
                targetId = smartspaceMediaData.targetId, isValid = smartspaceMediaData.isValid)
                targetId = smartspaceMediaData.targetId,
                isValid = smartspaceMediaData.isValid,
                instanceId = smartspaceMediaData.instanceId)
        }
        listeners.forEach { it.onSmartspaceMediaDataRemoved(key, immediately) }
    }
@@ -252,9 +259,12 @@ class MediaDataFilter @Inject constructor(
                broadcastSender.sendBroadcast(dismissIntent)
            }
            smartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA.copy(
                targetId = smartspaceMediaData.targetId, isValid = smartspaceMediaData.isValid)
                targetId = smartspaceMediaData.targetId,
                isValid = smartspaceMediaData.isValid,
                instanceId = smartspaceMediaData.instanceId)
            mediaDataManager.dismissSmartspaceRecommendation(smartspaceMediaData.targetId,
                delay = 0L)
        }
        mediaDataManager.dismissSmartspaceRecommendation(smartspaceMediaData.targetId, delay = 0L)
    }

    /**
+30 −9
Original line number Diff line number Diff line
@@ -103,8 +103,17 @@ private val LOADING = MediaData(
        appUid = Process.INVALID_UID)

@VisibleForTesting
internal val EMPTY_SMARTSPACE_MEDIA_DATA = SmartspaceMediaData("INVALID", false, false,
    "INVALID", null, emptyList(), null, 0, 0)
internal val EMPTY_SMARTSPACE_MEDIA_DATA = SmartspaceMediaData(
    targetId = "INVALID",
    isActive = false,
    isValid = false,
    packageName = "INVALID",
    cardAction = null,
    recommendations = emptyList(),
    dismissIntent = null,
    backgroundColor = 0,
    headphoneConnectionTimeMillis = 0,
    instanceId = InstanceId.fakeInstanceId(-1))

fun isMediaNotification(sbn: StatusBarNotification): Boolean {
    return sbn.notification.isMediaNotification()
@@ -532,14 +541,16 @@ class MediaDataManager(
     * connection session.
     */
    fun dismissSmartspaceRecommendation(key: String, delay: Long) {
        if (smartspaceMediaData.targetId != key) {
        if (smartspaceMediaData.targetId != key || !smartspaceMediaData.isValid) {
            // If this doesn't match, or we've already invalidated the data, no action needed
            return
        }

        if (DEBUG) Log.d(TAG, "Dismissing Smartspace media target")
        if (smartspaceMediaData.isActive) {
            smartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA.copy(
                targetId = smartspaceMediaData.targetId)
                targetId = smartspaceMediaData.targetId,
                instanceId = smartspaceMediaData.instanceId)
        }
        foregroundExecutor.executeDelayed(
            { notifySmartspaceMediaDataRemoved(
@@ -1035,7 +1046,8 @@ class MediaDataManager(
                    Log.d(TAG, "Set Smartspace media to be inactive for the data update")
                }
                smartspaceMediaData = EMPTY_SMARTSPACE_MEDIA_DATA.copy(
                    targetId = smartspaceMediaData.targetId)
                    targetId = smartspaceMediaData.targetId,
                    instanceId = smartspaceMediaData.instanceId)
                notifySmartspaceMediaDataRemoved(smartspaceMediaData.targetId, immediately = false)
            }
            1 -> {
@@ -1214,15 +1226,24 @@ class MediaDataManager(
                .getParcelable(EXTRAS_SMARTSPACE_DISMISS_INTENT_KEY) as Intent?
        }
        packageName(target)?.let {
            return SmartspaceMediaData(target.smartspaceTargetId, isActive, true, it,
                target.baseAction, target.iconGrid,
                dismissIntent, 0, target.creationTimeMillis)
            return SmartspaceMediaData(
                targetId = target.smartspaceTargetId,
                isActive = isActive,
                isValid = true,
                packageName = it,
                cardAction = target.baseAction,
                recommendations = target.iconGrid,
                dismissIntent = dismissIntent,
                backgroundColor = 0,
                headphoneConnectionTimeMillis = target.creationTimeMillis,
                instanceId = logger.getNewInstanceId())
        }
        return EMPTY_SMARTSPACE_MEDIA_DATA
            .copy(targetId = target.smartspaceTargetId,
                    isActive = isActive,
                    dismissIntent = dismissIntent,
                    headphoneConnectionTimeMillis = target.creationTimeMillis)
                    headphoneConnectionTimeMillis = target.creationTimeMillis,
                    instanceId = logger.getNewInstanceId())
    }

    private fun packageName(target: SmartspaceTarget): String? {
+41 −1
Original line number Diff line number Diff line
@@ -151,6 +151,31 @@ class MediaUiEventLogger @Inject constructor(private val logger: UiEventLogger)
        }
        logger.log(event)
    }

    fun logRecommendationAdded(packageName: String, instanceId: InstanceId) {
        logger.logWithInstanceId(MediaUiEvent.MEDIA_RECOMMENDATION_ADDED, 0, packageName,
            instanceId)
    }

    fun logRecommendationRemoved(packageName: String, instanceId: InstanceId) {
        logger.logWithInstanceId(MediaUiEvent.MEDIA_RECOMMENDATION_REMOVED, 0, packageName,
            instanceId)
    }

    fun logRecommendationActivated(uid: Int, packageName: String, instanceId: InstanceId) {
        logger.logWithInstanceId(MediaUiEvent.MEDIA_RECOMMENDATION_ACTIVATED, uid, packageName,
            instanceId)
    }

    fun logRecommendationItemTap(packageName: String, instanceId: InstanceId, position: Int) {
        logger.logWithInstanceIdAndPosition(MediaUiEvent.MEDIA_RECOMMENDATION_ITEM_TAP, 0,
            packageName, instanceId, position)
    }

    fun logRecommendationCardTap(packageName: String, instanceId: InstanceId) {
        logger.logWithInstanceId(MediaUiEvent.MEDIA_RECOMMENDATION_CARD_TAP, 0, packageName,
            instanceId)
    }
}

enum class MediaUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum {
@@ -233,7 +258,22 @@ enum class MediaUiEvent(val metricId: Int) : UiEventLogger.UiEventEnum {
    MEDIA_CAROUSEL_LOCATION_LOCKSCREEN(1039),

    @UiEvent(doc = "The media carousel moved to the dream state")
    MEDIA_CAROUSEL_LOCATION_DREAM(1040);
    MEDIA_CAROUSEL_LOCATION_DREAM(1040),

    @UiEvent(doc = "A media recommendation card was added to the media carousel")
    MEDIA_RECOMMENDATION_ADDED(1041),

    @UiEvent(doc = "A media recommendation card was removed from the media carousel")
    MEDIA_RECOMMENDATION_REMOVED(1042),

    @UiEvent(doc = "An existing media control was made active as a recommendation")
    MEDIA_RECOMMENDATION_ACTIVATED(1043),

    @UiEvent(doc = "User tapped on an item in a media recommendation card")
    MEDIA_RECOMMENDATION_ITEM_TAP(1044),

    @UiEvent(doc = "User tapped on a media recommendation card")
    MEDIA_RECOMMENDATION_CARD_TAP(1045);

    override fun getId() = metricId
}
 No newline at end of file
Loading