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

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

Merge "Add logging for media recommendation events" into tm-dev

parents 2211b359 f000c437
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