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:
commit
c921168aa3
@ -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,17 +914,18 @@ 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 }
|
||||
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 }
|
||||
@ -917,9 +935,16 @@ internal object MediaPlayerData {
|
||||
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
|
||||
}
|
@ -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);
|
||||
|
@ -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) }
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -1079,12 +1079,24 @@ 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?
|
||||
* 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
|
||||
*/
|
||||
@ -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. */
|
||||
|
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -63,7 +63,8 @@ class MediaTimeoutListener @Inject constructor(
|
||||
oldKey: String?,
|
||||
data: MediaData,
|
||||
immediately: Boolean,
|
||||
receivedSmartspaceCardLatency: Int
|
||||
receivedSmartspaceCardLatency: Int,
|
||||
isSsReactivated: Boolean
|
||||
) {
|
||||
var reusedListener: PlaybackStateListener? = null
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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) {
|
||||
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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()) {
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user