Loading packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +5 −0 Original line number Diff line number Diff line Loading @@ -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) Loading packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +9 −0 Original line number Diff line number Diff line Loading @@ -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 */); } }); Loading Loading @@ -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)); Loading Loading @@ -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 ); Loading Loading @@ -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()); Loading packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt +14 −4 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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 = Loading @@ -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) } } Loading Loading @@ -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) } } Loading Loading @@ -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) } /** Loading packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +30 −9 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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( Loading Loading @@ -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 -> { Loading Loading @@ -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? { Loading packages/SystemUI/src/com/android/systemui/media/MediaUiEventLogger.kt +41 −1 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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
packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +5 −0 Original line number Diff line number Diff line Loading @@ -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) Loading
packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +9 −0 Original line number Diff line number Diff line Loading @@ -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 */); } }); Loading Loading @@ -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)); Loading Loading @@ -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 ); Loading Loading @@ -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()); Loading
packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt +14 −4 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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 = Loading @@ -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) } } Loading Loading @@ -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) } } Loading Loading @@ -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) } /** Loading
packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +30 −9 Original line number Diff line number Diff line Loading @@ -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() Loading Loading @@ -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( Loading Loading @@ -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 -> { Loading Loading @@ -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? { Loading
packages/SystemUI/src/com/android/systemui/media/MediaUiEventLogger.kt +41 −1 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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