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

Commit b770541d authored by Michael Mikhail's avatar Michael Mikhail Committed by Android (Google) Code Review
Browse files

Merge "Set up environment for media smartspace user events" into main

parents 86e251eb f995fe63
Loading
Loading
Loading
Loading
+120 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.systemui.media.controls.shared.model.MediaDataLoadingModel
import com.android.systemui.media.controls.shared.model.SmartspaceMediaData
import com.android.systemui.media.controls.shared.model.SmartspaceMediaLoadingModel
import com.android.systemui.media.controls.util.MediaSmartspaceLogger
import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_DISMISS_EVENT
import com.android.systemui.media.controls.util.SmallHash
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.util.time.SystemClock
@@ -362,6 +363,77 @@ constructor(
        return _smartspaceMediaData.value.isActive
    }

    /** Log user event on media card if smartspace logging is enabled. */
    fun logSmartspaceCardUserEvent(
        eventId: Int,
        location: Int,
        interactedSubCardRank: Int = 0,
        interactedSubCardCardinality: Int = 0,
        instanceId: InstanceId? = null,
        isRec: Boolean = false
    ) {
        _currentMedia.value.forEachIndexed { index, mediaCommonModel ->
            when (mediaCommonModel) {
                is MediaCommonModel.MediaControl -> {
                    if (mediaCommonModel.mediaLoadedModel.instanceId == instanceId) {
                        if (isSmartspaceLoggingEnabled(mediaCommonModel, index)) {
                            logSmartspaceMediaCardUserEvent(
                                instanceId,
                                index,
                                eventId,
                                location,
                                mediaCommonModel.mediaLoadedModel.isSsReactivated,
                                interactedSubCardRank,
                                interactedSubCardCardinality
                            )
                        }
                        return
                    }
                }
                is MediaCommonModel.MediaRecommendations -> {
                    if (isRec) {
                        if (isSmartspaceLoggingEnabled(mediaCommonModel, index)) {
                            logSmarspaceRecommendationCardUserEvent(
                                eventId,
                                location,
                                index,
                                interactedSubCardRank,
                                interactedSubCardCardinality
                            )
                        }
                        return
                    }
                }
            }
        }
    }

    /** Log media and recommendation cards dismissal if smartspace logging is enabled for each. */
    fun logSmartspaceCardsOnSwipeToDismiss(location: Int) {
        _currentMedia.value.forEachIndexed { index, mediaCommonModel ->
            if (isSmartspaceLoggingEnabled(mediaCommonModel, index)) {
                when (mediaCommonModel) {
                    is MediaCommonModel.MediaControl ->
                        logSmartspaceMediaCardUserEvent(
                            mediaCommonModel.mediaLoadedModel.instanceId,
                            index,
                            SMARTSPACE_CARD_DISMISS_EVENT,
                            location,
                            mediaCommonModel.mediaLoadedModel.isSsReactivated,
                            isSwipeToDismiss = true
                        )
                    is MediaCommonModel.MediaRecommendations ->
                        logSmarspaceRecommendationCardUserEvent(
                            SMARTSPACE_CARD_DISMISS_EVENT,
                            location,
                            index,
                            isSwipeToDismiss = true
                        )
                }
            }
        }
    }

    private fun canBeRemoved(data: MediaData): Boolean {
        return data.isPlaying?.let { !it } ?: data.isClearable && !data.active
    }
@@ -394,6 +466,54 @@ constructor(
        }
    }

    private fun logSmartspaceMediaCardUserEvent(
        instanceId: InstanceId,
        index: Int,
        eventId: Int,
        location: Int,
        isReactivated: Boolean,
        interactedSubCardRank: Int = 0,
        interactedSubCardCardinality: Int = 0,
        isSwipeToDismiss: Boolean = false
    ) {
        _selectedUserEntries.value[instanceId]?.let {
            smartspaceLogger.logSmartspaceCardUIEvent(
                eventId,
                it.smartspaceId,
                it.appUid,
                location,
                _currentMedia.value.size,
                isSsReactivated = isReactivated,
                interactedSubcardRank = interactedSubCardRank,
                interactedSubcardCardinality = interactedSubCardCardinality,
                rank = index,
                isSwipeToDismiss = isSwipeToDismiss,
            )
        }
    }

    private fun logSmarspaceRecommendationCardUserEvent(
        eventId: Int,
        location: Int,
        index: Int,
        interactedSubCardRank: Int = 0,
        interactedSubCardCardinality: Int = 0,
        isSwipeToDismiss: Boolean = false
    ) {
        smartspaceLogger.logSmartspaceCardUIEvent(
            eventId,
            SmallHash.hash(_smartspaceMediaData.value.targetId),
            _smartspaceMediaData.value.getUid(applicationContext),
            location,
            _currentMedia.value.size,
            isRecommendationCard = true,
            interactedSubcardRank = interactedSubCardRank,
            interactedSubcardCardinality = interactedSubCardCardinality,
            rank = index,
            isSwipeToDismiss = isSwipeToDismiss,
        )
    }

    private fun isSmartspaceLoggingEnabled(commonModel: MediaCommonModel, index: Int): Boolean {
        return sortedMedia.size > index &&
            (_smartspaceMediaData.value.expiryTimeMs != 0L ||
+28 −0
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.systemui.media.controls.util

import android.util.Log
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager
import com.android.systemui.scene.shared.flag.SceneContainerFlag
import com.android.systemui.shared.system.SysUiStatsLog
import javax.inject.Inject

@@ -85,6 +87,8 @@ class MediaSmartspaceLogger @Inject constructor() {
        cardinality: Int,
        isRecommendationCard: Boolean = false,
        isSsReactivated: Boolean = false,
        interactedSubcardRank: Int = 0,
        interactedSubcardCardinality: Int = 0,
        rank: Int = 0,
        isSwipeToDismiss: Boolean = false,
    ) {
@@ -96,6 +100,8 @@ class MediaSmartspaceLogger @Inject constructor() {
            cardinality,
            isRecommendationCard,
            isSsReactivated,
            interactedSubcardRank,
            interactedSubcardCardinality,
            rank = rank,
            isSwipeToDismiss = isSwipeToDismiss,
        )
@@ -187,5 +193,27 @@ class MediaSmartspaceLogger @Inject constructor() {
        const val SMARTSPACE_CARD_CLICK_EVENT = 760
        const val SMARTSPACE_CARD_DISMISS_EVENT = 761
        const val SMARTSPACE_CARD_SEEN_EVENT = 800

        /**
         * Get the location of media view given [currentEndLocation]
         *
         * @return location used for Smartspace logging
         */
        fun getSurface(location: Int): Int {
            SceneContainerFlag.isUnexpectedlyInLegacyMode()
            return when (location) {
                MediaHierarchyManager.LOCATION_QQS,
                MediaHierarchyManager.LOCATION_QS -> {
                    SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__SHADE
                }
                MediaHierarchyManager.LOCATION_LOCKSCREEN -> {
                    SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__LOCKSCREEN
                }
                MediaHierarchyManager.LOCATION_DREAM_OVERLAY -> {
                    SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__DREAM_OVERLAY
                }
                else -> SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__DEFAULT_SURFACE
            }
        }
    }
}