diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index d4e2214f8b38..b93239ba7197 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -217,17 +217,17 @@ class MediaCarouselController @Inject constructor( oldKey: String?, data: MediaData, immediately: Boolean, - receivedSmartspaceCardLatency: Int + receivedSmartspaceCardLatency: Int, + isSsReactivated: Boolean ) { - if (addOrUpdatePlayer(key, oldKey, data)) { + if (addOrUpdatePlayer(key, oldKey, data, isSsReactivated)) { // Log card received if a new resumable media card is added MediaPlayerData.getMediaPlayer(key)?.let { /* ktlint-disable max-line-length */ logSmartspaceCardReported(759, // SMARTSPACE_CARD_RECEIVED it.mSmartspaceId, it.mUid, - /* isRecommendationCard */ false, - intArrayOf( + surfaces = intArrayOf( SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__SHADE, SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__LOCKSCREEN), rank = MediaPlayerData.getMediaPlayerIndex(key)) @@ -250,8 +250,7 @@ class MediaCarouselController @Inject constructor( logSmartspaceCardReported(759, // SMARTSPACE_CARD_RECEIVED it.mSmartspaceId, it.mUid, - /* isRecommendationCard */ false, - intArrayOf( + surfaces = intArrayOf( SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__SHADE, SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__LOCKSCREEN), rank = index, @@ -285,12 +284,17 @@ class MediaCarouselController @Inject constructor( override fun onSmartspaceMediaDataLoaded( key: String, data: SmartspaceMediaData, - shouldPrioritize: Boolean, - isSsReactivated: Boolean + shouldPrioritize: Boolean ) { if (DEBUG) Log.d(TAG, "Loading Smartspace media update") + // Log the case where the hidden media carousel with the existed inactive resume + // media is shown by the Smartspace signal. if (data.isActive) { - if (isSsReactivated && shouldPrioritize) { + val hasActivatedExistedResumeMedia = + !mediaManager.hasActiveMedia() && + mediaManager.hasAnyMedia() && + shouldPrioritize + if (hasActivatedExistedResumeMedia) { // Log resume card received if resumable media card is reactivated and // recommendation card is valid and ranked first MediaPlayerData.players().forEachIndexed { index, it -> @@ -302,8 +306,7 @@ class MediaCarouselController @Inject constructor( logSmartspaceCardReported(759, // SMARTSPACE_CARD_RECEIVED it.mSmartspaceId, it.mUid, - /* isRecommendationCard */ false, - intArrayOf( + surfaces = intArrayOf( SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__SHADE, SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__LOCKSCREEN), rank = index, @@ -318,8 +321,7 @@ class MediaCarouselController @Inject constructor( logSmartspaceCardReported(759, // SMARTSPACE_CARD_RECEIVED it.mSmartspaceId, it.mUid, - /* isRecommendationCard */ true, - intArrayOf( + surfaces = intArrayOf( SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__SHADE, SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__LOCKSCREEN), rank = MediaPlayerData.getMediaPlayerIndex(key), @@ -417,7 +419,12 @@ class MediaCarouselController @Inject constructor( } // Returns true if new player is added - private fun addOrUpdatePlayer(key: String, oldKey: String?, data: MediaData): Boolean { + private fun addOrUpdatePlayer( + key: String, + oldKey: String?, + data: MediaData, + isSsReactivated: Boolean + ): Boolean { MediaPlayerData.moveIfExists(oldKey, key) val existingPlayer = MediaPlayerData.getMediaPlayer(key) val curVisibleMediaKey = MediaPlayerData.playerKeys() @@ -432,12 +439,12 @@ class MediaCarouselController @Inject constructor( newPlayer.mediaViewHolder?.player?.setLayoutParams(lp) newPlayer.bindPlayer(data, key) newPlayer.setListening(currentlyExpanded) - MediaPlayerData.addMediaPlayer(key, data, newPlayer, systemClock) + MediaPlayerData.addMediaPlayer(key, data, newPlayer, systemClock, isSsReactivated) updatePlayerToState(newPlayer, noAnimation = true) reorderAllPlayers(curVisibleMediaKey) } else { existingPlayer.bindPlayer(data, key) - MediaPlayerData.addMediaPlayer(key, data, existingPlayer, systemClock) + MediaPlayerData.addMediaPlayer(key, data, existingPlayer, systemClock, isSsReactivated) if (isReorderingAllowed || shouldScrollToActivePlayer) { reorderAllPlayers(curVisibleMediaKey) } else { @@ -531,8 +538,10 @@ class MediaCarouselController @Inject constructor( it.targetId, it, MediaPlayerData.shouldPrioritizeSs) } } else { + val isSsReactivated = MediaPlayerData.isSsReactivated(key) removePlayer(key, dismissMediaData = false, dismissRecommendation = false) - addOrUpdatePlayer(key = key, oldKey = null, data = data) + addOrUpdatePlayer( + key = key, oldKey = null, data = data, isSsReactivated = isSsReactivated) } } } @@ -686,7 +695,8 @@ class MediaCarouselController @Inject constructor( this.desiredHostState = it currentlyExpanded = it.expansion > 0 - val shouldCloseGuts = !currentlyExpanded && !mediaManager.hasActiveMedia() && + val shouldCloseGuts = !currentlyExpanded && + !mediaManager.hasActiveMediaOrRecommendation() && desiredHostState.showsOnlyActiveMedia for (mediaPlayer in MediaPlayerData.players()) { @@ -751,7 +761,6 @@ class MediaCarouselController @Inject constructor( val mediaControlPanel = MediaPlayerData.players().elementAt(visibleMediaIndex) val hasActiveMediaOrRecommendationCard = MediaPlayerData.hasActiveMediaOrRecommendationCard() - val isRecommendationCard = mediaControlPanel.recommendationViewHolder != null if (!hasActiveMediaOrRecommendationCard && !qsExpanded) { // Skip logging if on LS or QQS, and there is no active media card return @@ -759,7 +768,6 @@ class MediaCarouselController @Inject constructor( logSmartspaceCardReported(800, // SMARTSPACE_CARD_SEEN mediaControlPanel.mSmartspaceId, mediaControlPanel.mUid, - isRecommendationCard, intArrayOf(mediaControlPanel.surfaceForSmartspaceLogging)) mediaControlPanel.mIsImpressed = true } @@ -773,7 +781,6 @@ class MediaCarouselController @Inject constructor( * @param instanceId id to uniquely identify a card, e.g. each headphone generates a new * instanceId * @param uid uid for the application that media comes from - * @param isRecommendationCard whether the card is media recommendation * @param surfaces list of display surfaces the media card is on (e.g. lockscreen, shade) when * the event happened * @param interactedSubcardRank the rank for interacted media item for recommendation card, -1 @@ -783,21 +790,27 @@ class MediaCarouselController @Inject constructor( * @param rank the rank for media card in the media carousel, starting from 0 * @param receivedLatencyMillis latency in milliseconds for card received events. E.g. latency * between headphone connection to sysUI displays media recommendation card + * @param isSwipeToDismiss whether is to log swipe-to-dismiss event * */ fun logSmartspaceCardReported( eventId: Int, instanceId: Int, uid: Int, - isRecommendationCard: Boolean, surfaces: IntArray, interactedSubcardRank: Int = 0, interactedSubcardCardinality: Int = 0, rank: Int = mediaCarouselScrollHandler.visibleMediaIndex, - receivedLatencyMillis: Int = 0 + receivedLatencyMillis: Int = 0, + isSwipeToDismiss: Boolean = false ) { + if (MediaPlayerData.players().size <= rank) { + return + } + + val mediaControlKey = MediaPlayerData.playerKeys().elementAt(rank) // Only log media resume card when Smartspace data is available - if (!isRecommendationCard && + if (!mediaControlKey.isSsMediaRec && !mediaManager.smartspaceMediaData.isActive && MediaPlayerData.smartspaceMediaData == null) { return @@ -813,10 +826,13 @@ class MediaCarouselController @Inject constructor( // card type for each new feature. SysUiStatsLog.SMART_SPACE_CARD_REPORTED__CARD_TYPE__UNKNOWN_CARD, surface, - rank, + // Use -1 as rank value to indicate user swipe to dismiss the card + if (isSwipeToDismiss) -1 else rank, cardinality, - if (isRecommendationCard) + if (mediaControlKey.isSsMediaRec) 15 // MEDIA_RECOMMENDATION + else if (mediaControlKey.isSsReactivated) + 43 // MEDIA_RESUME_SS_ACTIVATED else 31, // MEDIA_RESUME uid, @@ -828,7 +844,9 @@ class MediaCarouselController @Inject constructor( if (DEBUG) { Log.d(TAG, "Log Smartspace card event id: $eventId instance id: $instanceId" + " surface: $surface rank: $rank cardinality: $cardinality " + - "isRecommendationCard: $isRecommendationCard uid: $uid " + + "isRecommendationCard: ${mediaControlKey.isSsMediaRec} " + + "isSsReactivated: ${mediaControlKey.isSsReactivated}" + + "uid: $uid " + "interactedSubcardRank: $interactedSubcardRank " + "interactedSubcardCardinality: $interactedSubcardCardinality " + "received_latency_millis: $receivedLatencyMillis") @@ -843,10 +861,9 @@ class MediaCarouselController @Inject constructor( logSmartspaceCardReported(SMARTSPACE_CARD_DISMISS_EVENT, it.mSmartspaceId, it.mUid, - it.recommendationViewHolder != null, intArrayOf(it.surfaceForSmartspaceLogging), - // Use -1 as rank value to indicate user swipe to dismiss the card - rank = -1) + rank = index, + isSwipeToDismiss = true) // Reset card impressed state when swipe to dismissed it.mIsImpressed = false } @@ -897,29 +914,37 @@ internal object MediaPlayerData { private set data class MediaSortKey( - // Whether the item represents a Smartspace media recommendation. - val isSsMediaRec: Boolean, + val isSsMediaRec: Boolean, // Whether the item represents a Smartspace media recommendation. val data: MediaData, - val updateTime: Long = 0 + val updateTime: Long = 0, + val isSsReactivated: Boolean = false ) private val comparator = compareByDescending { it.data.isPlaying == true && it.data.playbackLocation == MediaData.PLAYBACK_LOCAL } - .thenByDescending { it.data.isPlaying == true && - it.data.playbackLocation == MediaData.PLAYBACK_CAST_LOCAL } - .thenByDescending { if (shouldPrioritizeSs) it.isSsMediaRec else !it.isSsMediaRec } - .thenByDescending { !it.data.resumption } - .thenByDescending { it.data.playbackLocation != MediaData.PLAYBACK_CAST_REMOTE } - .thenByDescending { it.updateTime } - .thenByDescending { it.data.notificationKey } + .thenByDescending { it.data.isPlaying == true && + it.data.playbackLocation == MediaData.PLAYBACK_CAST_LOCAL + } + .thenByDescending { if (shouldPrioritizeSs) it.isSsMediaRec else !it.isSsMediaRec } + .thenByDescending { !it.data.resumption } + .thenByDescending { it.data.playbackLocation != MediaData.PLAYBACK_CAST_REMOTE } + .thenByDescending { it.updateTime } + .thenByDescending { it.data.notificationKey } private val mediaPlayers = TreeMap(comparator) private val mediaData: MutableMap = mutableMapOf() - fun addMediaPlayer(key: String, data: MediaData, player: MediaControlPanel, clock: SystemClock) { + fun addMediaPlayer( + key: String, + data: MediaData, + player: MediaControlPanel, + clock: SystemClock, + isSsReactivated: Boolean + ) { removeMediaPlayer(key) - val sortKey = MediaSortKey(isSsMediaRec = false, data, clock.currentTimeMillis()) + val sortKey = MediaSortKey(isSsMediaRec = false, + data, clock.currentTimeMillis(), isSsReactivated = isSsReactivated) mediaData.put(key, sortKey) mediaPlayers.put(sortKey, player) } @@ -933,8 +958,8 @@ internal object MediaPlayerData { ) { shouldPrioritizeSs = shouldPrioritize removeMediaPlayer(key) - val sortKey = MediaSortKey(/* isSsMediaRec= */ true, - EMPTY.copy(isPlaying = false), clock.currentTimeMillis()) + val sortKey = MediaSortKey(isSsMediaRec = true, + EMPTY.copy(isPlaying = false), clock.currentTimeMillis(), isSsReactivated = true) mediaData.put(key, sortKey) mediaPlayers.put(sortKey, player) smartspaceMediaData = data @@ -1014,4 +1039,8 @@ internal object MediaPlayerData { } return false } + + fun isSsReactivated(key: String): Boolean = mediaData.get(key)?.let { + it.isSsReactivated + } ?: false } \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index 7ac70bd78953..5ead375a1084 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -178,8 +178,7 @@ public class MediaControlPanel { if (mPackageName != null && mInstanceId != null) { mLogger.logSeek(mUid, mPackageName, mInstanceId); } - logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT, - /* isRecommendationCard */ false); + logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT); return Unit.INSTANCE; }); } @@ -335,8 +334,7 @@ public class MediaControlPanel { if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return; if (mMediaViewController.isGutsVisible()) return; - logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT, - /* isRecommendationCard */ false); + logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT); mActivityStarter.postStartActivityDismissingKeyguard(clickIntent, buildLaunchAnimatorController(mMediaViewHolder.getPlayer())); }); @@ -440,9 +438,7 @@ public class MediaControlPanel { mMediaViewHolder.getDismiss().setEnabled(isDismissible); mMediaViewHolder.getDismiss().setOnClickListener(v -> { if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return; - - logSmartspaceCardReported(SMARTSPACE_CARD_DISMISS_EVENT, - /* isRecommendationCard */ false); + logSmartspaceCardReported(SMARTSPACE_CARD_DISMISS_EVENT); mLogger.logLongPressDismiss(mUid, mPackageName, mInstanceId); if (mKey != null) { @@ -683,8 +679,7 @@ public class MediaControlPanel { button.setOnClickListener(v -> { if (!mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) { mLogger.logTapAction(button.getId(), mUid, mPackageName, mInstanceId); - logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT, - /* isRecommendationCard */ false); + logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT); action.run(); if (icon instanceof Animatable) { @@ -932,8 +927,9 @@ public class MediaControlPanel { mRecommendationViewHolder.getDismiss().setOnClickListener(v -> { if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return; - logSmartspaceCardReported(SMARTSPACE_CARD_DISMISS_EVENT, - /* isRecommendationCard */ true); + logSmartspaceCardReported( + 761 // SMARTSPACE_CARD_DISMISS + ); closeGuts(); mMediaDataManagerLazy.get().dismissSmartspaceRecommendation( data.getTargetId(), MediaViewController.GUTS_ANIMATION_DURATION + 100L); @@ -1068,7 +1064,6 @@ public class MediaControlPanel { if (mFalsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return; logSmartspaceCardReported(SMARTSPACE_CARD_CLICK_EVENT, - /* isRecommendationCard */ true, interactedSubcardRank, getSmartspaceSubCardCardinality()); @@ -1138,18 +1133,17 @@ public class MediaControlPanel { return SysUiStatsLog.SMART_SPACE_CARD_REPORTED__DISPLAY_SURFACE__DEFAULT_SURFACE; } - private void logSmartspaceCardReported(int eventId, boolean isRecommendationCard) { - logSmartspaceCardReported(eventId, isRecommendationCard, + private void logSmartspaceCardReported(int eventId) { + logSmartspaceCardReported(eventId, /* interactedSubcardRank */ 0, /* interactedSubcardCardinality */ 0); } - private void logSmartspaceCardReported(int eventId, boolean isRecommendationCard, + private void logSmartspaceCardReported(int eventId, int interactedSubcardRank, int interactedSubcardCardinality) { mMediaCarouselController.logSmartspaceCardReported(eventId, mSmartspaceId, mUid, - isRecommendationCard, new int[]{getSurfaceForSmartspaceLogging()}, interactedSubcardRank, interactedSubcardCardinality); diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt index b68f2a7654f0..311973ad5af0 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataCombineLatest.kt @@ -32,7 +32,8 @@ class MediaDataCombineLatest @Inject constructor() : MediaDataManager.Listener, oldKey: String?, data: MediaData, immediately: Boolean, - receivedSmartspaceCardLatency: Int + receivedSmartspaceCardLatency: Int, + isSsReactivated: Boolean ) { if (oldKey != null && oldKey != key && entries.contains(oldKey)) { entries[key] = data to entries.remove(oldKey)?.second @@ -46,8 +47,7 @@ class MediaDataCombineLatest @Inject constructor() : MediaDataManager.Listener, override fun onSmartspaceMediaDataLoaded( key: String, data: SmartspaceMediaData, - shouldPrioritize: Boolean, - isSsReactivated: Boolean + shouldPrioritize: Boolean ) { listeners.toSet().forEach { it.onSmartspaceMediaDataLoaded(key, data) } } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt index de44a9c46963..80a407b9d90f 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataFilter.kt @@ -89,7 +89,8 @@ class MediaDataFilter @Inject constructor( oldKey: String?, data: MediaData, immediately: Boolean, - receivedSmartspaceCardLatency: Int + receivedSmartspaceCardLatency: Int, + isSsReactivated: Boolean ) { if (oldKey != null && oldKey != key) { allEntries.remove(oldKey) @@ -114,8 +115,7 @@ class MediaDataFilter @Inject constructor( override fun onSmartspaceMediaDataLoaded( key: String, data: SmartspaceMediaData, - shouldPrioritize: Boolean, - isSsReactivated: Boolean + shouldPrioritize: Boolean ) { if (!data.isActive) { Log.d(TAG, "Inactive recommendation data. Skip triggering.") @@ -140,13 +140,12 @@ class MediaDataFilter @Inject constructor( } } - val activeMedia = userEntries.filter { (key, value) -> value.active } - var isSsReactivatedMutable = activeMedia.isEmpty() && userEntries.isNotEmpty() + val shouldReactivate = !hasActiveMedia() && hasAnyMedia() if (timeSinceActive < smartspaceMaxAgeMillis) { // It could happen there are existing active media resume cards, then we don't need to // reactivate. - if (isSsReactivatedMutable) { + if (shouldReactivate) { val lastActiveKey = sorted.lastKey() // most recently active // Notify listeners to consider this media active Log.d(TAG, "reactivating $lastActiveKey instead of smartspace") @@ -156,7 +155,7 @@ class MediaDataFilter @Inject constructor( it.onMediaDataLoaded(lastActiveKey, lastActiveKey, mediaData, receivedSmartspaceCardLatency = (systemClock.currentTimeMillis() - data.headphoneConnectionTimeMillis) - .toInt()) + .toInt(), isSsReactivated = true) } } } else { @@ -168,8 +167,7 @@ class MediaDataFilter @Inject constructor( Log.d(TAG, "Invalid recommendation data. Skip showing the rec card") return } - listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data, shouldPrioritizeMutable, - isSsReactivatedMutable) } + listeners.forEach { it.onSmartspaceMediaDataLoaded(key, data, shouldPrioritizeMutable) } } override fun onMediaDataRemoved(key: String) { @@ -260,14 +258,27 @@ class MediaDataFilter @Inject constructor( } /** - * Are there any media notifications active? + * Are there any media notifications active, including the recommendation? */ - fun hasActiveMedia() = userEntries.any { it.value.active } || smartspaceMediaData.isActive + fun hasActiveMediaOrRecommendation() = + userEntries.any { it.value.active } || + (smartspaceMediaData.isActive && smartspaceMediaData.isValid) /** * Are there any media entries we should display? */ - fun hasAnyMedia() = userEntries.isNotEmpty() || smartspaceMediaData.isActive + fun hasAnyMediaOrRecommendation() = userEntries.isNotEmpty() || + (smartspaceMediaData.isActive && smartspaceMediaData.isValid) + + /** + * Are there any media notifications active (excluding the recommendation)? + */ + fun hasActiveMedia() = userEntries.any { it.value.active } + + /** + * Are there any media entries we should display (excluding the recommendation)? + */ + fun hasAnyMedia() = userEntries.isNotEmpty() /** * Add a listener for filtered [MediaData] changes diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt index 08c3395b4528..908aef41034e 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDataManager.kt @@ -1079,15 +1079,27 @@ class MediaDataManager( fun onSwipeToDismiss() = mediaDataFilter.onSwipeToDismiss() /** - * Are there any media notifications active? + * Are there any media notifications active, including the recommendations? + */ + fun hasActiveMediaOrRecommendation() = mediaDataFilter.hasActiveMediaOrRecommendation() + + /** + * Are there any media entries we should display, including the recommendations? + * If resumption is enabled, this will include inactive players + * If resumption is disabled, we only want to show active players + */ + fun hasAnyMediaOrRecommendation() = mediaDataFilter.hasAnyMediaOrRecommendation() + + /** + * Are there any resume media notifications active, excluding the recommendations? */ fun hasActiveMedia() = mediaDataFilter.hasActiveMedia() /** - * Are there any media entries we should display? - * If resumption is enabled, this will include inactive players - * If resumption is disabled, we only want to show active players - */ + * Are there any resume media notifications active, excluding the recommendations? + * If resumption is enabled, this will include inactive players + * If resumption is disabled, we only want to show active players + */ fun hasAnyMedia() = mediaDataFilter.hasAnyMedia() interface Listener { @@ -1106,13 +1118,17 @@ class MediaDataManager( * @param receivedSmartspaceCardLatency is the latency between headphone connects and sysUI * displays Smartspace media targets. Will be 0 if the data is not activated by Smartspace * signal. + * + * @param isSsReactivated indicates resume media card is reactivated by Smartspace + * recommendation signal */ fun onMediaDataLoaded( key: String, oldKey: String?, data: MediaData, immediately: Boolean = true, - receivedSmartspaceCardLatency: Int = 0 + receivedSmartspaceCardLatency: Int = 0, + isSsReactivated: Boolean = false ) {} /** @@ -1121,15 +1137,11 @@ class MediaDataManager( * @param shouldPrioritize indicates the sorting priority of the Smartspace card. If true, * it will be prioritized as the first card. Otherwise, it will show up as the last card as * default. - * - * @param isSsReactivated indicates resume media card is reactivated by Smartspace - * recommendation signal */ fun onSmartspaceMediaDataLoaded( key: String, data: SmartspaceMediaData, - shouldPrioritize: Boolean = false, - isSsReactivated: Boolean = false + shouldPrioritize: Boolean = false ) {} /** Called whenever a previously existing Media notification was removed. */ diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt index ffae898d07fa..824a6fd9d96e 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaDeviceManager.kt @@ -72,7 +72,8 @@ class MediaDeviceManager @Inject constructor( oldKey: String?, data: MediaData, immediately: Boolean, - receivedSmartspaceCardLatency: Int + receivedSmartspaceCardLatency: Int, + isSsReactivated: Boolean ) { if (oldKey != null && oldKey != key) { val oldEntry = entries.remove(oldKey) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt index d08b6f825f41..de2b5c9a4739 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaHost.kt @@ -68,7 +68,8 @@ class MediaHost constructor( oldKey: String?, data: MediaData, immediately: Boolean, - receivedSmartspaceCardLatency: Int + receivedSmartspaceCardLatency: Int, + isSsReactivated: Boolean ) { if (immediately) { updateViewVisibility() @@ -78,8 +79,7 @@ class MediaHost constructor( override fun onSmartspaceMediaDataLoaded( key: String, data: SmartspaceMediaData, - shouldPrioritize: Boolean, - isSsReactivated: Boolean + shouldPrioritize: Boolean ) { updateViewVisibility() } @@ -169,9 +169,9 @@ class MediaHost constructor( private fun updateViewVisibility() { state.visible = if (showsOnlyActiveMedia) { - mediaDataManager.hasActiveMedia() + mediaDataManager.hasActiveMediaOrRecommendation() } else { - mediaDataManager.hasAnyMedia() + mediaDataManager.hasAnyMediaOrRecommendation() } val newVisibility = if (visible) View.VISIBLE else View.GONE if (newVisibility != hostView.visibility) { diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt index 35f95dd27c1f..61d0b41e9bb6 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaResumeListener.kt @@ -184,7 +184,8 @@ class MediaResumeListener @Inject constructor( oldKey: String?, data: MediaData, immediately: Boolean, - receivedSmartspaceCardLatency: Int + receivedSmartspaceCardLatency: Int, + isSsReactivated: Boolean ) { if (useMediaResumption) { // If this had been started from a resume state, disconnect now that it's live diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaSessionBasedFilter.kt b/packages/SystemUI/src/com/android/systemui/media/MediaSessionBasedFilter.kt index 1c448a2ff8c4..31792967899d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaSessionBasedFilter.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaSessionBasedFilter.kt @@ -96,7 +96,8 @@ class MediaSessionBasedFilter @Inject constructor( oldKey: String?, data: MediaData, immediately: Boolean, - receivedSmartspaceCardLatency: Int + receivedSmartspaceCardLatency: Int, + isSsReactivated: Boolean ) { backgroundExecutor.execute { data.token?.let { @@ -143,8 +144,7 @@ class MediaSessionBasedFilter @Inject constructor( override fun onSmartspaceMediaDataLoaded( key: String, data: SmartspaceMediaData, - shouldPrioritize: Boolean, - isSsReactivated: Boolean + shouldPrioritize: Boolean ) { backgroundExecutor.execute { dispatchSmartspaceMediaDataLoaded(key, data) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt b/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt index 9581a633a8c5..51755065d4b6 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaTimeoutListener.kt @@ -63,7 +63,8 @@ class MediaTimeoutListener @Inject constructor( oldKey: String?, data: MediaData, immediately: Boolean, - receivedSmartspaceCardLatency: Int + receivedSmartspaceCardLatency: Int, + isSsReactivated: Boolean ) { var reusedListener: PlaybackStateListener? = null diff --git a/packages/SystemUI/src/com/android/systemui/media/dream/MediaDreamSentinel.java b/packages/SystemUI/src/com/android/systemui/media/dream/MediaDreamSentinel.java index 8934cd1085b8..e077fed7805d 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dream/MediaDreamSentinel.java +++ b/packages/SystemUI/src/com/android/systemui/media/dream/MediaDreamSentinel.java @@ -56,13 +56,13 @@ public class MediaDreamSentinel extends CoreStartable { @Override public void onSmartspaceMediaDataLoaded(@NonNull String key, - @NonNull SmartspaceMediaData data, boolean shouldPrioritize, - boolean isSsReactivated) { + @NonNull SmartspaceMediaData data, boolean shouldPrioritize) { } @Override public void onMediaDataLoaded(@NonNull String key, @Nullable String oldKey, - @NonNull MediaData data, boolean immediately, int receivedSmartspaceCardLatency) { + @NonNull MediaData data, boolean immediately, int receivedSmartspaceCardLatency, + boolean isSsReactivated) { if (mAdded) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java index 052c57e768fe..7239d0cc361b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMediaManager.java @@ -245,13 +245,12 @@ public class NotificationMediaManager implements Dumpable { @Override public void onMediaDataLoaded(@NonNull String key, @Nullable String oldKey, @NonNull MediaData data, boolean immediately, - int receivedSmartspaceCardLatency) { + int receivedSmartspaceCardLatency, boolean isSsReactivated) { } @Override public void onSmartspaceMediaDataLoaded(@NonNull String key, - @NonNull SmartspaceMediaData data, boolean shouldPrioritize, - boolean isSsReactivated) { + @NonNull SmartspaceMediaData data, boolean shouldPrioritize) { } @Override @@ -320,13 +319,12 @@ public class NotificationMediaManager implements Dumpable { @Override public void onMediaDataLoaded(@NonNull String key, @Nullable String oldKey, @NonNull MediaData data, boolean immediately, - int receivedSmartspaceCardLatency) { + int receivedSmartspaceCardLatency, boolean isSsReactivated) { } @Override public void onSmartspaceMediaDataLoaded(@NonNull String key, - @NonNull SmartspaceMediaData data, boolean shouldPrioritize, - boolean isSsReactivated) { + @NonNull SmartspaceMediaData data, boolean shouldPrioritize) { } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index a3026a4c00e6..20fc39d6482f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -1355,9 +1355,11 @@ public class NotificationPanelViewController extends PanelViewController { int userSwitcherPreferredY = mStatusBarHeaderHeightKeyguard; boolean bypassEnabled = mKeyguardBypassController.getBypassEnabled(); final boolean hasVisibleNotifications = mNotificationStackScrollLayoutController - .getVisibleNotificationCount() != 0 || mMediaDataManager.hasActiveMedia(); + .getVisibleNotificationCount() != 0 + || mMediaDataManager.hasActiveMediaOrRecommendation(); boolean splitShadeWithActiveMedia = - mShouldUseSplitNotificationShade && mMediaDataManager.hasActiveMedia(); + mShouldUseSplitNotificationShade + && mMediaDataManager.hasActiveMediaOrRecommendation(); boolean shouldAnimateClockChange = mScreenOffAnimationController.shouldAnimateClockChange(); if ((hasVisibleNotifications && !mShouldUseSplitNotificationShade) || (splitShadeWithActiveMedia && !mDozing)) { @@ -1424,7 +1426,8 @@ public class NotificationPanelViewController extends PanelViewController { private void updateKeyguardStatusViewAlignment(boolean animate) { boolean hasVisibleNotifications = mNotificationStackScrollLayoutController - .getVisibleNotificationCount() != 0 || mMediaDataManager.hasActiveMedia(); + .getVisibleNotificationCount() != 0 + || mMediaDataManager.hasActiveMediaOrRecommendation(); boolean shouldBeCentered = !mShouldUseSplitNotificationShade || !hasVisibleNotifications || mDozing; if (mStatusViewCentered != shouldBeCentered) { @@ -2622,7 +2625,7 @@ public class NotificationPanelViewController extends PanelViewController { float endPosition = 0; if (pxAmount > 0.0f) { if (mNotificationStackScrollLayoutController.getVisibleNotificationCount() == 0 - && !mMediaDataManager.hasActiveMedia()) { + && !mMediaDataManager.hasActiveMediaOrRecommendation()) { // No notifications are visible, let's animate to the height of qs instead if (mQs != null) { // Let's interpolate to the header height instead of the top padding, diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt index 46e675684782..26296d67c71a 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaCarouselControllerTest.kt @@ -142,7 +142,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { expected.forEach { clock.setCurrentTimeMillis(it.third) MediaPlayerData.addMediaPlayer(it.first, it.second.copy(notificationKey = it.first), - panel, clock) + panel, clock, isSsReactivated = false) } for ((index, key) in MediaPlayerData.playerKeys().withIndex()) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java index b0f6a80bc8a5..eacec20cac12 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataCombineLatestTest.java @@ -87,10 +87,10 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { public void eventNotEmittedWithoutDevice() { // WHEN data source emits an event without device data mManager.onMediaDataLoaded(KEY, null, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); // THEN an event isn't emitted verify(mListener, never()).onMediaDataLoaded(eq(KEY), any(), any(), anyBoolean(), - anyInt()); + anyInt(), anyBoolean()); } @Test @@ -99,7 +99,7 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { mManager.onMediaDeviceChanged(KEY, null, mDeviceData); // THEN an event isn't emitted verify(mListener, never()).onMediaDataLoaded(eq(KEY), any(), any(), anyBoolean(), - anyInt()); + anyInt(), anyBoolean()); } @Test @@ -108,11 +108,11 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { mManager.onMediaDeviceChanged(KEY, null, mDeviceData); // WHEN media event is received mManager.onMediaDataLoaded(KEY, null, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); // THEN the listener receives a combined event ArgumentCaptor captor = ArgumentCaptor.forClass(MediaData.class); verify(mListener).onMediaDataLoaded(eq(KEY), any(), captor.capture(), anyBoolean(), - anyInt()); + anyInt(), anyBoolean()); assertThat(captor.getValue().getDevice()).isNotNull(); } @@ -120,13 +120,13 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { public void emitEventAfterMediaFirst() { // GIVEN that media event has already been received mManager.onMediaDataLoaded(KEY, null, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); // WHEN device event is received mManager.onMediaDeviceChanged(KEY, null, mDeviceData); // THEN the listener receives a combined event ArgumentCaptor captor = ArgumentCaptor.forClass(MediaData.class); verify(mListener).onMediaDataLoaded(eq(KEY), any(), captor.capture(), anyBoolean(), - anyInt()); + anyInt(), anyBoolean()); assertThat(captor.getValue().getDevice()).isNotNull(); } @@ -134,16 +134,16 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { public void migrateKeyMediaFirst() { // GIVEN that media and device info has already been received mManager.onMediaDataLoaded(OLD_KEY, null, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); mManager.onMediaDeviceChanged(OLD_KEY, null, mDeviceData); reset(mListener); // WHEN a key migration event is received mManager.onMediaDataLoaded(KEY, OLD_KEY, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); // THEN the listener receives a combined event ArgumentCaptor captor = ArgumentCaptor.forClass(MediaData.class); verify(mListener).onMediaDataLoaded(eq(KEY), eq(OLD_KEY), captor.capture(), anyBoolean(), - anyInt()); + anyInt(), anyBoolean()); assertThat(captor.getValue().getDevice()).isNotNull(); } @@ -151,7 +151,7 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { public void migrateKeyDeviceFirst() { // GIVEN that media and device info has already been received mManager.onMediaDataLoaded(OLD_KEY, null, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); mManager.onMediaDeviceChanged(OLD_KEY, null, mDeviceData); reset(mListener); // WHEN a key migration event is received @@ -159,7 +159,7 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { // THEN the listener receives a combined event ArgumentCaptor captor = ArgumentCaptor.forClass(MediaData.class); verify(mListener).onMediaDataLoaded(eq(KEY), eq(OLD_KEY), captor.capture(), anyBoolean(), - anyInt()); + anyInt(), anyBoolean()); assertThat(captor.getValue().getDevice()).isNotNull(); } @@ -167,17 +167,17 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { public void migrateKeyMediaAfter() { // GIVEN that media and device info has already been received mManager.onMediaDataLoaded(OLD_KEY, null, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); mManager.onMediaDeviceChanged(OLD_KEY, null, mDeviceData); mManager.onMediaDeviceChanged(KEY, OLD_KEY, mDeviceData); reset(mListener); // WHEN a second key migration event is received for media mManager.onMediaDataLoaded(KEY, OLD_KEY, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); // THEN the key has already been migrated ArgumentCaptor captor = ArgumentCaptor.forClass(MediaData.class); verify(mListener).onMediaDataLoaded(eq(KEY), eq(KEY), captor.capture(), anyBoolean(), - anyInt()); + anyInt(), anyBoolean()); assertThat(captor.getValue().getDevice()).isNotNull(); } @@ -185,17 +185,17 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { public void migrateKeyDeviceAfter() { // GIVEN that media and device info has already been received mManager.onMediaDataLoaded(OLD_KEY, null, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); mManager.onMediaDeviceChanged(OLD_KEY, null, mDeviceData); mManager.onMediaDataLoaded(KEY, OLD_KEY, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); reset(mListener); // WHEN a second key migration event is received for the device mManager.onMediaDeviceChanged(KEY, OLD_KEY, mDeviceData); // THEN the key has already be migrated ArgumentCaptor captor = ArgumentCaptor.forClass(MediaData.class); verify(mListener).onMediaDataLoaded(eq(KEY), eq(KEY), captor.capture(), anyBoolean(), - anyInt()); + anyInt(), anyBoolean()); assertThat(captor.getValue().getDevice()).isNotNull(); } @@ -210,7 +210,7 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { @Test public void mediaDataRemovedAfterMediaEvent() { mManager.onMediaDataLoaded(KEY, null, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); mManager.onMediaDataRemoved(KEY); verify(mListener).onMediaDataRemoved(eq(KEY)); } @@ -226,14 +226,14 @@ public class MediaDataCombineLatestTest extends SysuiTestCase { public void mediaDataKeyUpdated() { // GIVEN that device and media events have already been received mManager.onMediaDataLoaded(KEY, null, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); mManager.onMediaDeviceChanged(KEY, null, mDeviceData); // WHEN the key is changed mManager.onMediaDataLoaded("NEW_KEY", KEY, mMediaData, true /* immediately */, - 0 /* receivedSmartspaceCardLatency */); + 0 /* receivedSmartspaceCardLatency */, false /* isSsReactivated */); // THEN the listener gets a load event with the correct keys ArgumentCaptor captor = ArgumentCaptor.forClass(MediaData.class); verify(mListener).onMediaDataLoaded( - eq("NEW_KEY"), any(), captor.capture(), anyBoolean(), anyInt()); + eq("NEW_KEY"), any(), captor.capture(), anyBoolean(), anyInt(), anyBoolean()); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt index b8e249fcfeb1..3b996d4a37d3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataFilterTest.kt @@ -115,7 +115,7 @@ class MediaDataFilterTest : SysuiTestCase() { // THEN we should tell the listener verify(listener).onMediaDataLoaded(eq(KEY), eq(null), eq(dataMain), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -124,7 +124,8 @@ class MediaDataFilterTest : SysuiTestCase() { mediaDataFilter.onMediaDataLoaded(KEY, null, dataGuest) // THEN we should NOT tell the listener - verify(listener, never()).onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt()) + verify(listener, never()).onMediaDataLoaded(any(), any(), any(), anyBoolean(), + anyInt(), anyBoolean()) } @Test @@ -171,51 +172,56 @@ class MediaDataFilterTest : SysuiTestCase() { // THEN we should add back the guest user media verify(listener).onMediaDataLoaded(eq(KEY_ALT), eq(null), eq(dataGuest), eq(true), - eq(0)) + eq(0), eq(false)) // but not the main user's verify(listener, never()).onMediaDataLoaded(eq(KEY), any(), eq(dataMain), anyBoolean(), - anyInt()) + anyInt(), anyBoolean()) } @Test - fun testHasAnyMedia() { - assertThat(mediaDataFilter.hasAnyMedia()).isFalse() + fun testHasAnyMediaOrRecommendation() { + assertThat(mediaDataFilter.hasAnyMediaOrRecommendation()).isFalse() mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = dataMain) + assertThat(mediaDataFilter.hasAnyMediaOrRecommendation()).isTrue() assertThat(mediaDataFilter.hasAnyMedia()).isTrue() } @Test - fun testHasActiveMedia() { - assertThat(mediaDataFilter.hasActiveMedia()).isFalse() + fun testHasActiveMediaOrRecommendation() { + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isFalse() val data = dataMain.copy(active = true) mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = data) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isTrue() assertThat(mediaDataFilter.hasActiveMedia()).isTrue() } @Test - fun testHasAnyMedia_onlyCurrentUser() { - assertThat(mediaDataFilter.hasAnyMedia()).isFalse() + fun testHasAnyMediaOrRecommendation_onlyCurrentUser() { + assertThat(mediaDataFilter.hasAnyMediaOrRecommendation()).isFalse() mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = dataGuest) + assertThat(mediaDataFilter.hasAnyMediaOrRecommendation()).isFalse() assertThat(mediaDataFilter.hasAnyMedia()).isFalse() } @Test - fun testHasActiveMedia_onlyCurrentUser() { - assertThat(mediaDataFilter.hasActiveMedia()).isFalse() + fun testHasActiveMediaOrRecommendation_onlyCurrentUser() { + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isFalse() val data = dataGuest.copy(active = true) mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = data) - assertThat(mediaDataFilter.hasActiveMedia()).isFalse() + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isFalse() + assertThat(mediaDataFilter.hasAnyMedia()).isFalse() } @Test fun testOnNotificationRemoved_doesntHaveMedia() { mediaDataFilter.onMediaDataLoaded(KEY, oldKey = null, data = dataMain) mediaDataFilter.onMediaDataRemoved(KEY) + assertThat(mediaDataFilter.hasAnyMediaOrRecommendation()).isFalse() assertThat(mediaDataFilter.hasAnyMedia()).isFalse() } @@ -232,9 +238,9 @@ class MediaDataFilterTest : SysuiTestCase() { mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true), - eq(false)) - assertThat(mediaDataFilter.hasActiveMedia()).isTrue() + .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true)) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isTrue() + assertThat(mediaDataFilter.hasActiveMedia()).isFalse() } @Test @@ -243,9 +249,10 @@ class MediaDataFilterTest : SysuiTestCase() { mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) - verify(listener, never()).onMediaDataLoaded(any(), any(), any(), anyBoolean(), anyInt()) - verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean(), - anyBoolean()) + verify(listener, never()).onMediaDataLoaded(any(), any(), any(), anyBoolean(), + anyInt(), anyBoolean()) + verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean()) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isFalse() assertThat(mediaDataFilter.hasActiveMedia()).isFalse() } @@ -257,9 +264,9 @@ class MediaDataFilterTest : SysuiTestCase() { mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true), - eq(true)) - assertThat(mediaDataFilter.hasActiveMedia()).isTrue() + .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(true)) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isTrue() + assertThat(mediaDataFilter.hasActiveMedia()).isFalse() } @Test @@ -271,8 +278,8 @@ class MediaDataFilterTest : SysuiTestCase() { clock.advanceTime(SMARTSPACE_MAX_AGE + 100) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) - verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean(), - anyBoolean()) + verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean()) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isFalse() assertThat(mediaDataFilter.hasActiveMedia()).isFalse() } @@ -284,16 +291,16 @@ class MediaDataFilterTest : SysuiTestCase() { val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener).onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), - eq(0)) + eq(0), eq(false)) // AND we get a smartspace signal mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) // THEN we should tell listeners to treat the media as not active instead verify(listener, never()).onMediaDataLoaded(eq(KEY), eq(KEY), any(), anyBoolean(), - anyInt()) - verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean(), - anyBoolean()) + anyInt(), anyBoolean()) + verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean()) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isFalse() assertThat(mediaDataFilter.hasActiveMedia()).isFalse() } @@ -305,7 +312,7 @@ class MediaDataFilterTest : SysuiTestCase() { val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener).onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), - eq(0)) + eq(0), eq(false)) // AND we get a smartspace signal mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) @@ -313,11 +320,10 @@ class MediaDataFilterTest : SysuiTestCase() { // THEN we should tell listeners to treat the media as active instead val dataCurrentAndActive = dataCurrent.copy(active = true) verify(listener).onMediaDataLoaded(eq(KEY), eq(KEY), eq(dataCurrentAndActive), eq(true), - eq(100)) - assertThat(mediaDataFilter.hasActiveMedia()).isTrue() + eq(100), eq(true)) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isFalse() // Smartspace update shouldn't be propagated for the empty rec list. - verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean(), - anyBoolean()) + verify(listener, never()).onSmartspaceMediaDataLoaded(any(), any(), anyBoolean()) } @Test @@ -326,7 +332,7 @@ class MediaDataFilterTest : SysuiTestCase() { val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener).onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), - eq(0)) + eq(0), eq(false)) // AND we get a smartspace signal mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) @@ -334,12 +340,11 @@ class MediaDataFilterTest : SysuiTestCase() { // THEN we should tell listeners to treat the media as active instead val dataCurrentAndActive = dataCurrent.copy(active = true) verify(listener).onMediaDataLoaded(eq(KEY), eq(KEY), eq(dataCurrentAndActive), eq(true), - eq(100)) - assertThat(mediaDataFilter.hasActiveMedia()).isTrue() + eq(100), eq(true)) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isTrue() // Smartspace update should also be propagated but not prioritized. verify(listener) - .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false), - eq(true)) + .onSmartspaceMediaDataLoaded(eq(SMARTSPACE_KEY), eq(smartspaceData), eq(false)) } @Test @@ -348,6 +353,7 @@ class MediaDataFilterTest : SysuiTestCase() { mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY) verify(listener).onSmartspaceMediaDataRemoved(SMARTSPACE_KEY) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isFalse() assertThat(mediaDataFilter.hasActiveMedia()).isFalse() } @@ -356,17 +362,18 @@ class MediaDataFilterTest : SysuiTestCase() { val dataCurrent = dataMain.copy(active = false, lastActive = clock.elapsedRealtime()) mediaDataFilter.onMediaDataLoaded(KEY, null, dataCurrent) verify(listener).onMediaDataLoaded(eq(KEY), eq(null), eq(dataCurrent), eq(true), - eq(0)) + eq(0), eq(false)) mediaDataFilter.onSmartspaceMediaDataLoaded(SMARTSPACE_KEY, smartspaceData) val dataCurrentAndActive = dataCurrent.copy(active = true) verify(listener).onMediaDataLoaded(eq(KEY), eq(KEY), eq(dataCurrentAndActive), eq(true), - eq(100)) + eq(100), eq(true)) mediaDataFilter.onSmartspaceMediaDataRemoved(SMARTSPACE_KEY) verify(listener).onSmartspaceMediaDataRemoved(SMARTSPACE_KEY) + assertThat(mediaDataFilter.hasActiveMediaOrRecommendation()).isFalse() assertThat(mediaDataFilter.hasActiveMedia()).isFalse() } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt index ccd8ef1b7c6b..b9ff8775f2b8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaDataManagerTest.kt @@ -210,7 +210,7 @@ class MediaDataManagerTest : SysuiTestCase() { backgroundExecutor.runAllReady() foregroundExecutor.runAllReady() verify(listener).onMediaDataLoaded(eq(PACKAGE_NAME), eq(null), capture(mediaDataCaptor), - eq(true), eq(0)) + eq(true), eq(0), eq(false)) mediaDataManager.setTimedOut(PACKAGE_NAME, timedOut = true) verify(logger).logMediaTimeout(anyInt(), eq(PACKAGE_NAME), @@ -244,7 +244,7 @@ class MediaDataManagerTest : SysuiTestCase() { assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) assertThat(mediaDataCaptor.value!!.active).isTrue() } @@ -266,7 +266,7 @@ class MediaDataManagerTest : SysuiTestCase() { assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) assertThat(mediaDataCaptor.value!!.playbackLocation).isEqualTo( MediaData.PLAYBACK_CAST_REMOTE) verify(logger).logActiveMediaAdded(anyInt(), eq(SYSTEM_PACKAGE_NAME), @@ -295,7 +295,7 @@ class MediaDataManagerTest : SysuiTestCase() { // THEN the media data indicates that it is for resumption verify(listener) .onMediaDataLoaded(eq(PACKAGE_NAME), eq(KEY), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) assertThat(mediaDataCaptor.value.resumption).isTrue() assertThat(mediaDataCaptor.value.isPlaying).isFalse() verify(logger).logActiveConvertedToResume(anyInt(), eq(PACKAGE_NAME), eq(data.instanceId)) @@ -311,7 +311,7 @@ class MediaDataManagerTest : SysuiTestCase() { assertThat(foregroundExecutor.runAllReady()).isEqualTo(2) verify(listener) .onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) val data = mediaDataCaptor.value assertThat(data.resumption).isFalse() val resumableData = data.copy(resumeAction = Runnable {}) @@ -323,7 +323,7 @@ class MediaDataManagerTest : SysuiTestCase() { // THEN the data is for resumption and the key is migrated to the package name verify(listener) .onMediaDataLoaded(eq(PACKAGE_NAME), eq(KEY), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) assertThat(mediaDataCaptor.value.resumption).isTrue() verify(listener, never()).onMediaDataRemoved(eq(KEY)) // WHEN the second is removed @@ -332,7 +332,7 @@ class MediaDataManagerTest : SysuiTestCase() { verify(listener) .onMediaDataLoaded( eq(PACKAGE_NAME), eq(PACKAGE_NAME), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) assertThat(mediaDataCaptor.value.resumption).isTrue() verify(listener).onMediaDataRemoved(eq(KEY_2)) } @@ -373,7 +373,7 @@ class MediaDataManagerTest : SysuiTestCase() { // THEN the media data indicates that it is for resumption verify(listener) .onMediaDataLoaded(eq(PACKAGE_NAME), eq(null), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) val data = mediaDataCaptor.value assertThat(data.resumption).isTrue() assertThat(data.song).isEqualTo(SESSION_TITLE) @@ -396,7 +396,7 @@ class MediaDataManagerTest : SysuiTestCase() { assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) verify(listener).onMediaDataLoaded(eq(PACKAGE_NAME), eq(null), capture(mediaDataCaptor), - eq(true), eq(0)) + eq(true), eq(0), eq(false)) val data = mediaDataCaptor.value mediaDataManager.setMediaResumptionEnabled(false) @@ -445,7 +445,7 @@ class MediaDataManagerTest : SysuiTestCase() { assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) verify(listener) .onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -456,7 +456,7 @@ class MediaDataManagerTest : SysuiTestCase() { eq(SmartspaceMediaData(KEY_MEDIA_SMARTSPACE, true /* isActive */, true /*isValid */, PACKAGE_NAME, mediaSmartspaceBaseAction, listOf(mediaRecommendationItem), DISMISS_INTENT, 0, 1234L)), - eq(false), eq(false)) + eq(false)) } @Test @@ -469,7 +469,7 @@ class MediaDataManagerTest : SysuiTestCase() { .copy(targetId = KEY_MEDIA_SMARTSPACE, isActive = true, isValid = false, dismissIntent = DISMISS_INTENT, headphoneConnectionTimeMillis = 1234L)), - eq(false), eq(false)) + eq(false)) } @Test @@ -489,14 +489,14 @@ class MediaDataManagerTest : SysuiTestCase() { eq(EMPTY_SMARTSPACE_MEDIA_DATA .copy(targetId = KEY_MEDIA_SMARTSPACE, isActive = true, isValid = false, dismissIntent = null, headphoneConnectionTimeMillis = 1234L)), - eq(false), eq(false)) + eq(false)) } @Test fun testOnSmartspaceMediaDataLoaded_hasNoneMediaTarget_notCallsListener() { smartspaceMediaDataProvider.onTargetsAvailable(listOf()) verify(listener, never()) - .onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean(), anyBoolean()) + .onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean()) } @Test @@ -520,7 +520,7 @@ class MediaDataManagerTest : SysuiTestCase() { // THEN smartspace signal is ignored verify(listener, never()) - .onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean(), anyBoolean()) + .onSmartspaceMediaDataLoaded(anyObject(), anyObject(), anyBoolean()) } @Test @@ -528,7 +528,7 @@ class MediaDataManagerTest : SysuiTestCase() { // GIVEN a media recommendation card is present smartspaceMediaDataProvider.onTargetsAvailable(listOf(mediaSmartspaceTarget)) verify(listener).onSmartspaceMediaDataLoaded(eq(KEY_MEDIA_SMARTSPACE), anyObject(), - anyBoolean(), anyBoolean()) + anyBoolean()) // WHEN the media recommendation setting is turned off Settings.Secure.putInt(context.contentResolver, @@ -562,7 +562,7 @@ class MediaDataManagerTest : SysuiTestCase() { // THEN the last active time is not changed verify(listener).onMediaDataLoaded(eq(KEY), eq(KEY), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) assertThat(mediaDataCaptor.value.lastActive).isLessThan(currentTime) } @@ -584,7 +584,7 @@ class MediaDataManagerTest : SysuiTestCase() { // THEN the last active time is not changed verify(listener) .onMediaDataLoaded(eq(PACKAGE_NAME), eq(KEY), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) assertThat(mediaDataCaptor.value.resumption).isTrue() assertThat(mediaDataCaptor.value.lastActive).isLessThan(currentTime) @@ -615,7 +615,7 @@ class MediaDataManagerTest : SysuiTestCase() { // THEN only the first MAX_COMPACT_ACTIONS are actually set verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) assertThat(mediaDataCaptor.value.actionsToShowInCompact.size).isEqualTo( MediaDataManager.MAX_COMPACT_ACTIONS) } @@ -640,7 +640,7 @@ class MediaDataManagerTest : SysuiTestCase() { assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) assertThat(mediaDataCaptor.value!!.semanticActions).isNull() assertThat(mediaDataCaptor.value!!.actions).hasSize(1) @@ -803,6 +803,6 @@ class MediaDataManagerTest : SysuiTestCase() { assertThat(backgroundExecutor.runAllReady()).isEqualTo(1) assertThat(foregroundExecutor.runAllReady()).isEqualTo(1) verify(listener).onMediaDataLoaded(eq(KEY), eq(null), capture(mediaDataCaptor), eq(true), - eq(0)) + eq(0), eq(false)) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaPlayerDataTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaPlayerDataTest.kt index 7bd210d762f9..6e38d26411ee 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaPlayerDataTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaPlayerDataTest.kt @@ -61,8 +61,10 @@ public class MediaPlayerDataTest : SysuiTestCase() { val playerIsRemote = mock(MediaControlPanel::class.java) val dataIsRemote = createMediaData("app2", PLAYING, REMOTE, !RESUMPTION) - MediaPlayerData.addMediaPlayer("2", dataIsRemote, playerIsRemote, systemClock) - MediaPlayerData.addMediaPlayer("1", dataIsPlaying, playerIsPlaying, systemClock) + MediaPlayerData.addMediaPlayer("2", dataIsRemote, playerIsRemote, systemClock, + isSsReactivated = false) + MediaPlayerData.addMediaPlayer("1", dataIsPlaying, playerIsPlaying, systemClock, + isSsReactivated = false) val players = MediaPlayerData.players() assertThat(players).hasSize(2) @@ -77,18 +79,22 @@ public class MediaPlayerDataTest : SysuiTestCase() { val playerIsPlaying2 = mock(MediaControlPanel::class.java) var dataIsPlaying2 = createMediaData("app2", !PLAYING, LOCAL, !RESUMPTION) - MediaPlayerData.addMediaPlayer("1", dataIsPlaying1, playerIsPlaying1, systemClock) + MediaPlayerData.addMediaPlayer("1", dataIsPlaying1, playerIsPlaying1, systemClock, + isSsReactivated = false) systemClock.advanceTime(1) - MediaPlayerData.addMediaPlayer("2", dataIsPlaying2, playerIsPlaying2, systemClock) + MediaPlayerData.addMediaPlayer("2", dataIsPlaying2, playerIsPlaying2, systemClock, + isSsReactivated = false) systemClock.advanceTime(1) dataIsPlaying1 = createMediaData("app1", !PLAYING, LOCAL, !RESUMPTION) dataIsPlaying2 = createMediaData("app2", PLAYING, LOCAL, !RESUMPTION) - MediaPlayerData.addMediaPlayer("1", dataIsPlaying1, playerIsPlaying1, systemClock) + MediaPlayerData.addMediaPlayer("1", dataIsPlaying1, playerIsPlaying1, systemClock, + isSsReactivated = false) systemClock.advanceTime(1) - MediaPlayerData.addMediaPlayer("2", dataIsPlaying2, playerIsPlaying2, systemClock) + MediaPlayerData.addMediaPlayer("2", dataIsPlaying2, playerIsPlaying2, systemClock, + isSsReactivated = false) systemClock.advanceTime(1) val players = MediaPlayerData.players() @@ -116,14 +122,20 @@ public class MediaPlayerDataTest : SysuiTestCase() { val dataUndetermined = createMediaData("app6", UNDETERMINED, LOCAL, RESUMPTION) MediaPlayerData.addMediaPlayer( - "3", dataIsStoppedAndLocal, playerIsStoppedAndLocal, systemClock) + "3", dataIsStoppedAndLocal, playerIsStoppedAndLocal, systemClock, + isSsReactivated = false) MediaPlayerData.addMediaPlayer( - "5", dataIsStoppedAndRemote, playerIsStoppedAndRemote, systemClock) - MediaPlayerData.addMediaPlayer("4", dataCanResume, playerCanResume, systemClock) - MediaPlayerData.addMediaPlayer("1", dataIsPlaying, playerIsPlaying, systemClock) + "5", dataIsStoppedAndRemote, playerIsStoppedAndRemote, systemClock, + isSsReactivated = false) + MediaPlayerData.addMediaPlayer("4", dataCanResume, playerCanResume, systemClock, + isSsReactivated = false) + MediaPlayerData.addMediaPlayer("1", dataIsPlaying, playerIsPlaying, systemClock, + isSsReactivated = false) MediaPlayerData.addMediaPlayer( - "2", dataIsPlayingAndRemote, playerIsPlayingAndRemote, systemClock) - MediaPlayerData.addMediaPlayer("6", dataUndetermined, playerUndetermined, systemClock) + "2", dataIsPlayingAndRemote, playerIsPlayingAndRemote, systemClock, + isSsReactivated = false) + MediaPlayerData.addMediaPlayer("6", dataUndetermined, playerUndetermined, systemClock, + isSsReactivated = false) val players = MediaPlayerData.players() assertThat(players).hasSize(6) @@ -141,11 +153,13 @@ public class MediaPlayerDataTest : SysuiTestCase() { assertThat(MediaPlayerData.players()).hasSize(0) - MediaPlayerData.addMediaPlayer(keyA, data, playerIsPlaying, systemClock) + MediaPlayerData.addMediaPlayer(keyA, data, playerIsPlaying, systemClock, + isSsReactivated = false) systemClock.advanceTime(1) assertThat(MediaPlayerData.players()).hasSize(1) - MediaPlayerData.addMediaPlayer(keyB, data, playerIsPlaying, systemClock) + MediaPlayerData.addMediaPlayer(keyB, data, playerIsPlaying, systemClock, + isSsReactivated = false) systemClock.advanceTime(1) assertThat(MediaPlayerData.players()).hasSize(2) diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaSessionBasedFilterTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaSessionBasedFilterTest.kt index ee4f8db48ae3..558645377936 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaSessionBasedFilterTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaSessionBasedFilterTest.kt @@ -162,7 +162,7 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { bgExecutor.runAllReady() fgExecutor.runAllReady() verify(mediaListener).onMediaDataLoaded(eq(KEY), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -185,7 +185,7 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { fgExecutor.runAllReady() // THEN the event is not filtered verify(mediaListener).onMediaDataLoaded(eq(KEY), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -215,7 +215,7 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { fgExecutor.runAllReady() // THEN the event is not filtered verify(mediaListener).onMediaDataLoaded(eq(KEY), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -231,14 +231,14 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { fgExecutor.runAllReady() // THEN the event is not filtered verify(mediaListener).onMediaDataLoaded(eq(KEY), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) // WHEN a loaded event is received that matches the local session filter.onMediaDataLoaded(KEY, null, mediaData2) bgExecutor.runAllReady() fgExecutor.runAllReady() // THEN the event is filtered verify(mediaListener, never()).onMediaDataLoaded( - eq(KEY), eq(null), eq(mediaData2), anyBoolean(), anyInt()) + eq(KEY), eq(null), eq(mediaData2), anyBoolean(), anyInt(), anyBoolean()) } @Test @@ -255,7 +255,7 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { // THEN the event is not filtered because there isn't a notification for the remote // session. verify(mediaListener).onMediaDataLoaded(eq(KEY), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -273,14 +273,15 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { fgExecutor.runAllReady() // THEN the event is not filtered verify(mediaListener).onMediaDataLoaded(eq(key1), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) // WHEN a loaded event is received that matches the local session filter.onMediaDataLoaded(key2, null, mediaData2) bgExecutor.runAllReady() fgExecutor.runAllReady() // THEN the event is filtered verify(mediaListener, never()) - .onMediaDataLoaded(eq(key2), eq(null), eq(mediaData2), anyBoolean(), anyInt()) + .onMediaDataLoaded(eq(key2), eq(null), eq(mediaData2), anyBoolean(), + anyInt(), anyBoolean()) // AND there should be a removed event for key2 verify(mediaListener).onMediaDataRemoved(eq(key2)) } @@ -300,14 +301,14 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { fgExecutor.runAllReady() // THEN the event is not filtered verify(mediaListener).onMediaDataLoaded(eq(key1), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) // WHEN a loaded event is received that matches the remote session filter.onMediaDataLoaded(key2, null, mediaData2) bgExecutor.runAllReady() fgExecutor.runAllReady() // THEN the event is not filtered verify(mediaListener).onMediaDataLoaded(eq(key2), eq(null), eq(mediaData2), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -324,14 +325,14 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { fgExecutor.runAllReady() // THEN the event is not filtered verify(mediaListener).onMediaDataLoaded(eq(KEY), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) // WHEN a loaded event is received that matches the local session filter.onMediaDataLoaded(KEY, null, mediaData2) bgExecutor.runAllReady() fgExecutor.runAllReady() // THEN the event is not filtered verify(mediaListener).onMediaDataLoaded(eq(KEY), eq(null), eq(mediaData2), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -350,7 +351,7 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { fgExecutor.runAllReady() // THEN the event is not filtered verify(mediaListener).onMediaDataLoaded(eq(KEY), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -373,7 +374,7 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { fgExecutor.runAllReady() // THEN the key migration event is fired verify(mediaListener).onMediaDataLoaded(eq(key2), eq(key1), eq(mediaData2), eq(true), - eq(0)) + eq(0), eq(false)) } @Test @@ -403,13 +404,14 @@ public class MediaSessionBasedFilterTest : SysuiTestCase() { fgExecutor.runAllReady() // THEN the key migration event is filtered verify(mediaListener, never()) - .onMediaDataLoaded(eq(key2), eq(null), eq(mediaData2), anyBoolean(), anyInt()) + .onMediaDataLoaded(eq(key2), eq(null), eq(mediaData2), anyBoolean(), + anyInt(), anyBoolean()) // WHEN a loaded event is received that matches the remote session filter.onMediaDataLoaded(key2, null, mediaData1) bgExecutor.runAllReady() fgExecutor.runAllReady() // THEN the key migration event is fired verify(mediaListener).onMediaDataLoaded(eq(key2), eq(null), eq(mediaData1), eq(true), - eq(0)) + eq(0), eq(false)) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dream/MediaDreamSentinelTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dream/MediaDreamSentinelTest.java index 114fc90e8590..247316a32473 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dream/MediaDreamSentinelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dream/MediaDreamSentinelTest.java @@ -75,11 +75,13 @@ public class MediaDreamSentinelTest extends SysuiTestCase { final MediaDataManager.Listener listener = listenerCaptor.getValue(); when(mMediaDataManager.hasActiveMedia()).thenReturn(false); - listener.onMediaDataLoaded(mKey, mOldKey, mData, true, 0); + listener.onMediaDataLoaded(mKey, mOldKey, mData, /* immediately= */ true, + /* receivedSmartspaceCardLatency= */ 0, /* isSsReactived= */ false); verify(mDreamOverlayStateController, never()).addComplication(any()); when(mMediaDataManager.hasActiveMedia()).thenReturn(true); - listener.onMediaDataLoaded(mKey, mOldKey, mData, true, 0); + listener.onMediaDataLoaded(mKey, mOldKey, mData, /* immediately= */true, + /* receivedSmartspaceCardLatency= */0, /* isSsReactived= */ false); verify(mDreamOverlayStateController).addComplication(eq(mComplication)); listener.onMediaDataRemoved(mKey); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java index 22bf6c8324ae..7ef656c780a6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NotificationPanelViewControllerTest.java @@ -876,7 +876,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { public void testSwitchesToBigClockInSplitShadeOnAod() { mStatusBarStateController.setState(KEYGUARD); enableSplitShade(/* enabled= */ true); - when(mMediaDataManager.hasActiveMedia()).thenReturn(true); + when(mMediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(true); when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(2); clearInvocations(mKeyguardStatusViewController); @@ -904,7 +904,7 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase { mStatusBarStateController.setState(KEYGUARD); enableSplitShade(/* enabled= */ true); clearInvocations(mKeyguardStatusViewController); - when(mMediaDataManager.hasActiveMedia()).thenReturn(true); + when(mMediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(true); // one notification + media player visible when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(1);