Merge "Add the logging logic to distinguish the SS-reactivated resume media and user-activated one when there is no recommendation card." into tm-dev

This commit is contained in:
Cecilia Hong 2022-04-04 02:05:36 +00:00 committed by Android (Google) Code Review
commit c921168aa3
21 changed files with 303 additions and 228 deletions

View File

@ -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<MediaSortKey> { 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<MediaSortKey, MediaControlPanel>(comparator)
private val mediaData: MutableMap<String, MediaSortKey> = 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
}

View File

@ -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);

View File

@ -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) }
}

View File

@ -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

View File

@ -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. */

View File

@ -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)

View File

@ -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) {

View File

@ -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

View File

@ -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)

View File

@ -63,7 +63,8 @@ class MediaTimeoutListener @Inject constructor(
oldKey: String?,
data: MediaData,
immediately: Boolean,
receivedSmartspaceCardLatency: Int
receivedSmartspaceCardLatency: Int,
isSsReactivated: Boolean
) {
var reusedListener: PlaybackStateListener? = null

View File

@ -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;
}

View File

@ -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) {
}

View File

@ -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,

View File

@ -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()) {

View File

@ -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<MediaData> 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<MediaData> 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<MediaData> 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<MediaData> 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<MediaData> 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<MediaData> 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<MediaData> 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());
}
}

View File

@ -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()
}
}

View File

@ -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))
}
}

View File

@ -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)

View File

@ -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))
}
}

View File

@ -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);

View File

@ -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);