Loading packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaControlViewModelTest.kt +4 −4 Original line number Diff line number Diff line Loading @@ -99,14 +99,14 @@ class MediaControlViewModelTest : SysuiTestCase() { assertThat(playerModel).isNotNull() assertThat(playerModel?.titleName).isEqualTo(TITLE) assertThat(playerModel?.artistName).isEqualTo(ARTIST) assertThat(underTest.isNewPlayer(playerModel!!)).isTrue() assertThat(underTest.setPlayer(playerModel!!)).isTrue() mediaDataFilter.onMediaDataLoaded(KEY, KEY, mediaData) assertThat(playerModel).isNotNull() assertThat(playerModel?.titleName).isEqualTo(TITLE) assertThat(playerModel?.artistName).isEqualTo(ARTIST) assertThat(underTest.isNewPlayer(playerModel!!)).isFalse() assertThat(underTest.setPlayer(playerModel!!)).isFalse() } @Test Loading @@ -120,7 +120,7 @@ class MediaControlViewModelTest : SysuiTestCase() { assertThat(playerModel).isNotNull() assertThat(playerModel?.titleName).isEqualTo(TITLE) assertThat(playerModel?.artistName).isEqualTo(ARTIST) assertThat(underTest.isNewPlayer(playerModel!!)).isTrue() assertThat(underTest.setPlayer(playerModel!!)).isTrue() mediaData = initMediaData(ARTIST_2, TITLE_2) Loading @@ -129,7 +129,7 @@ class MediaControlViewModelTest : SysuiTestCase() { assertThat(playerModel).isNotNull() assertThat(playerModel?.titleName).isEqualTo(TITLE_2) assertThat(playerModel?.artistName).isEqualTo(ARTIST_2) assertThat(underTest.isNewPlayer(playerModel!!)).isTrue() assertThat(underTest.setPlayer(playerModel!!)).isTrue() } private fun initMediaData(artist: String, title: String): MediaData { Loading packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt +9 −41 Original line number Diff line number Diff line Loading @@ -30,14 +30,10 @@ import com.android.systemui.media.controls.util.MediaSmartspaceLogger import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_DISMISS_EVENT import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_SEEN_EVENT import com.android.systemui.media.controls.util.SmallHash import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.time.SystemClock import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import java.util.Locale import java.util.TreeMap import javax.inject.Inject import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow Loading @@ -49,37 +45,9 @@ class MediaFilterRepository constructor( @Application private val applicationContext: Context, private val systemClock: SystemClock, private val configurationController: ConfigurationController, private val smartspaceLogger: MediaSmartspaceLogger, ) { val onAnyMediaConfigurationChange: Flow<Unit> = conflatedCallbackFlow { val callback = object : ConfigurationController.ConfigurationListener { override fun onDensityOrFontScaleChanged() { trySend(Unit) } override fun onThemeChanged() { trySend(Unit) } override fun onUiModeChanged() { trySend(Unit) } override fun onLocaleListChanged() { if (locale != applicationContext.resources.configuration.locales.get(0)) { locale = applicationContext.resources.configuration.locales.get(0) trySend(Unit) } } } configurationController.addCallback(callback) trySend(Unit) awaitClose { configurationController.removeCallback(callback) } } /** Instance id of media control that recommendations card reactivated. */ private val _reactivatedId: MutableStateFlow<InstanceId?> = MutableStateFlow(null) val reactivatedId: StateFlow<InstanceId?> = _reactivatedId.asStateFlow() Loading Loading @@ -190,7 +158,7 @@ constructor( fun addMediaDataLoadingState( mediaDataLoadingModel: MediaDataLoadingModel, isUpdate: Boolean = true isUpdate: Boolean = true, ) { val sortedMap = TreeMap<MediaSortKeyModel, MediaCommonModel>(comparator) sortedMap.putAll( Loading Loading @@ -395,7 +363,7 @@ constructor( logSmarspaceRecommendationCardUserEvent( SMARTSPACE_CARD_SEEN_EVENT, surface, visibleIndex visibleIndex, ) } } Loading @@ -409,7 +377,7 @@ constructor( interactedSubCardRank: Int = 0, interactedSubCardCardinality: Int = 0, instanceId: InstanceId? = null, isRec: Boolean = false isRec: Boolean = false, ) { _currentMedia.value.forEachIndexed { index, mediaCommonModel -> when (mediaCommonModel) { Loading @@ -423,7 +391,7 @@ constructor( surface, mediaCommonModel.mediaLoadedModel.isSsReactivated, interactedSubCardRank, interactedSubCardCardinality interactedSubCardCardinality, ) } return Loading @@ -437,7 +405,7 @@ constructor( surface, index, interactedSubCardRank, interactedSubCardCardinality interactedSubCardCardinality, ) } return Loading @@ -459,14 +427,14 @@ constructor( SMARTSPACE_CARD_DISMISS_EVENT, surface, mediaCommonModel.mediaLoadedModel.isSsReactivated, isSwipeToDismiss = true isSwipeToDismiss = true, ) is MediaCommonModel.MediaRecommendations -> logSmarspaceRecommendationCardUserEvent( SMARTSPACE_CARD_DISMISS_EVENT, surface, index, isSwipeToDismiss = true isSwipeToDismiss = true, ) } } Loading Loading @@ -513,7 +481,7 @@ constructor( isReactivated: Boolean, interactedSubCardRank: Int = 0, interactedSubCardCardinality: Int = 0, isSwipeToDismiss: Boolean = false isSwipeToDismiss: Boolean = false, ) { _selectedUserEntries.value[instanceId]?.let { smartspaceLogger.logSmartspaceCardUIEvent( Loading @@ -537,7 +505,7 @@ constructor( index: Int, interactedSubCardRank: Int = 0, interactedSubCardCardinality: Int = 0, isSwipeToDismiss: Boolean = false isSwipeToDismiss: Boolean = false, ) { smartspaceLogger.logSmartspaceCardUIEvent( eventId, Loading packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractor.kt +0 −2 Original line number Diff line number Diff line Loading @@ -68,8 +68,6 @@ constructor( .map { entries -> entries[instanceId]?.let { toMediaControlModel(it) } } .distinctUntilChanged() val onAnyMediaConfigurationChange: Flow<Unit> = repository.onAnyMediaConfigurationChange fun removeMediaControl( token: MediaSession.Token?, instanceId: InstanceId, Loading packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractor.kt +5 −7 Original line number Diff line number Diff line Loading @@ -66,14 +66,12 @@ constructor( .distinctUntilChanged() .stateIn(applicationScope, SharingStarted.WhileSubscribed(), false) val onAnyMediaConfigurationChange: Flow<Unit> = repository.onAnyMediaConfigurationChange fun removeMediaRecommendations( key: String, dismissIntent: Intent?, delayMs: Long, eventId: Int, location: Int location: Int, ) { logSmartspaceCardUserEvent(eventId, location) mediaDataProcessor.dismissSmartspaceRecommendation(key, delayMs) Loading Loading @@ -101,7 +99,7 @@ constructor( eventId: Int, location: Int, interactedSubCardRank: Int, interactedSubCardCardinality: Int interactedSubCardCardinality: Int, ) { if (interactedSubCardRank == -1) { logSmartspaceCardUserEvent(eventId, MediaSmartspaceLogger.getSurface(location)) Loading @@ -111,7 +109,7 @@ constructor( MediaSmartspaceLogger.getSurface(location), interactedSubCardRank = interactedSubCardRank, interactedSubCardCardinality = interactedSubCardCardinality, isRec = true isRec = true, ) } if (shouldActivityOpenInForeground(intent)) { Loading @@ -121,7 +119,7 @@ constructor( 0 /* delay */, expandable.activityTransitionController( InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER ) ), ) } else { // Otherwise, open the activity in background directly. Loading @@ -133,7 +131,7 @@ constructor( repository.logSmartspaceCardUserEvent( eventId, MediaSmartspaceLogger.getSurface(location), isRec = true isRec = true, ) } Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaControlViewBinder.kt +2 −2 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.widget.ImageButton import androidx.constraintlayout.widget.ConstraintSet import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.settingslib.widget.AdaptiveIcon import com.android.systemui.animation.Expandable import com.android.systemui.common.shared.model.Icon Loading Loading @@ -64,7 +65,6 @@ import com.android.systemui.surfaceeffects.ripple.RippleAnimationConfig import com.android.systemui.surfaceeffects.ripple.RippleShader import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.collectLatest import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext private const val TAG = "MediaControlViewBinder" Loading @@ -85,7 +85,7 @@ object MediaControlViewBinder { launch { viewModel.player.collectLatest { player -> player?.let { if (viewModel.isNewPlayer(it)) { if (viewModel.setPlayer(it)) { bindMediaCard( viewHolder, viewController, Loading Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/media/controls/ui/viewmodel/MediaControlViewModelTest.kt +4 −4 Original line number Diff line number Diff line Loading @@ -99,14 +99,14 @@ class MediaControlViewModelTest : SysuiTestCase() { assertThat(playerModel).isNotNull() assertThat(playerModel?.titleName).isEqualTo(TITLE) assertThat(playerModel?.artistName).isEqualTo(ARTIST) assertThat(underTest.isNewPlayer(playerModel!!)).isTrue() assertThat(underTest.setPlayer(playerModel!!)).isTrue() mediaDataFilter.onMediaDataLoaded(KEY, KEY, mediaData) assertThat(playerModel).isNotNull() assertThat(playerModel?.titleName).isEqualTo(TITLE) assertThat(playerModel?.artistName).isEqualTo(ARTIST) assertThat(underTest.isNewPlayer(playerModel!!)).isFalse() assertThat(underTest.setPlayer(playerModel!!)).isFalse() } @Test Loading @@ -120,7 +120,7 @@ class MediaControlViewModelTest : SysuiTestCase() { assertThat(playerModel).isNotNull() assertThat(playerModel?.titleName).isEqualTo(TITLE) assertThat(playerModel?.artistName).isEqualTo(ARTIST) assertThat(underTest.isNewPlayer(playerModel!!)).isTrue() assertThat(underTest.setPlayer(playerModel!!)).isTrue() mediaData = initMediaData(ARTIST_2, TITLE_2) Loading @@ -129,7 +129,7 @@ class MediaControlViewModelTest : SysuiTestCase() { assertThat(playerModel).isNotNull() assertThat(playerModel?.titleName).isEqualTo(TITLE_2) assertThat(playerModel?.artistName).isEqualTo(ARTIST_2) assertThat(underTest.isNewPlayer(playerModel!!)).isTrue() assertThat(underTest.setPlayer(playerModel!!)).isTrue() } private fun initMediaData(artist: String, title: String): MediaData { Loading
packages/SystemUI/src/com/android/systemui/media/controls/data/repository/MediaFilterRepository.kt +9 −41 Original line number Diff line number Diff line Loading @@ -30,14 +30,10 @@ import com.android.systemui.media.controls.util.MediaSmartspaceLogger import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_DISMISS_EVENT import com.android.systemui.media.controls.util.MediaSmartspaceLogger.Companion.SMARTSPACE_CARD_SEEN_EVENT import com.android.systemui.media.controls.util.SmallHash import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.time.SystemClock import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import java.util.Locale import java.util.TreeMap import javax.inject.Inject import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow Loading @@ -49,37 +45,9 @@ class MediaFilterRepository constructor( @Application private val applicationContext: Context, private val systemClock: SystemClock, private val configurationController: ConfigurationController, private val smartspaceLogger: MediaSmartspaceLogger, ) { val onAnyMediaConfigurationChange: Flow<Unit> = conflatedCallbackFlow { val callback = object : ConfigurationController.ConfigurationListener { override fun onDensityOrFontScaleChanged() { trySend(Unit) } override fun onThemeChanged() { trySend(Unit) } override fun onUiModeChanged() { trySend(Unit) } override fun onLocaleListChanged() { if (locale != applicationContext.resources.configuration.locales.get(0)) { locale = applicationContext.resources.configuration.locales.get(0) trySend(Unit) } } } configurationController.addCallback(callback) trySend(Unit) awaitClose { configurationController.removeCallback(callback) } } /** Instance id of media control that recommendations card reactivated. */ private val _reactivatedId: MutableStateFlow<InstanceId?> = MutableStateFlow(null) val reactivatedId: StateFlow<InstanceId?> = _reactivatedId.asStateFlow() Loading Loading @@ -190,7 +158,7 @@ constructor( fun addMediaDataLoadingState( mediaDataLoadingModel: MediaDataLoadingModel, isUpdate: Boolean = true isUpdate: Boolean = true, ) { val sortedMap = TreeMap<MediaSortKeyModel, MediaCommonModel>(comparator) sortedMap.putAll( Loading Loading @@ -395,7 +363,7 @@ constructor( logSmarspaceRecommendationCardUserEvent( SMARTSPACE_CARD_SEEN_EVENT, surface, visibleIndex visibleIndex, ) } } Loading @@ -409,7 +377,7 @@ constructor( interactedSubCardRank: Int = 0, interactedSubCardCardinality: Int = 0, instanceId: InstanceId? = null, isRec: Boolean = false isRec: Boolean = false, ) { _currentMedia.value.forEachIndexed { index, mediaCommonModel -> when (mediaCommonModel) { Loading @@ -423,7 +391,7 @@ constructor( surface, mediaCommonModel.mediaLoadedModel.isSsReactivated, interactedSubCardRank, interactedSubCardCardinality interactedSubCardCardinality, ) } return Loading @@ -437,7 +405,7 @@ constructor( surface, index, interactedSubCardRank, interactedSubCardCardinality interactedSubCardCardinality, ) } return Loading @@ -459,14 +427,14 @@ constructor( SMARTSPACE_CARD_DISMISS_EVENT, surface, mediaCommonModel.mediaLoadedModel.isSsReactivated, isSwipeToDismiss = true isSwipeToDismiss = true, ) is MediaCommonModel.MediaRecommendations -> logSmarspaceRecommendationCardUserEvent( SMARTSPACE_CARD_DISMISS_EVENT, surface, index, isSwipeToDismiss = true isSwipeToDismiss = true, ) } } Loading Loading @@ -513,7 +481,7 @@ constructor( isReactivated: Boolean, interactedSubCardRank: Int = 0, interactedSubCardCardinality: Int = 0, isSwipeToDismiss: Boolean = false isSwipeToDismiss: Boolean = false, ) { _selectedUserEntries.value[instanceId]?.let { smartspaceLogger.logSmartspaceCardUIEvent( Loading @@ -537,7 +505,7 @@ constructor( index: Int, interactedSubCardRank: Int = 0, interactedSubCardCardinality: Int = 0, isSwipeToDismiss: Boolean = false isSwipeToDismiss: Boolean = false, ) { smartspaceLogger.logSmartspaceCardUIEvent( eventId, Loading
packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaControlInteractor.kt +0 −2 Original line number Diff line number Diff line Loading @@ -68,8 +68,6 @@ constructor( .map { entries -> entries[instanceId]?.let { toMediaControlModel(it) } } .distinctUntilChanged() val onAnyMediaConfigurationChange: Flow<Unit> = repository.onAnyMediaConfigurationChange fun removeMediaControl( token: MediaSession.Token?, instanceId: InstanceId, Loading
packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/interactor/MediaRecommendationsInteractor.kt +5 −7 Original line number Diff line number Diff line Loading @@ -66,14 +66,12 @@ constructor( .distinctUntilChanged() .stateIn(applicationScope, SharingStarted.WhileSubscribed(), false) val onAnyMediaConfigurationChange: Flow<Unit> = repository.onAnyMediaConfigurationChange fun removeMediaRecommendations( key: String, dismissIntent: Intent?, delayMs: Long, eventId: Int, location: Int location: Int, ) { logSmartspaceCardUserEvent(eventId, location) mediaDataProcessor.dismissSmartspaceRecommendation(key, delayMs) Loading Loading @@ -101,7 +99,7 @@ constructor( eventId: Int, location: Int, interactedSubCardRank: Int, interactedSubCardCardinality: Int interactedSubCardCardinality: Int, ) { if (interactedSubCardRank == -1) { logSmartspaceCardUserEvent(eventId, MediaSmartspaceLogger.getSurface(location)) Loading @@ -111,7 +109,7 @@ constructor( MediaSmartspaceLogger.getSurface(location), interactedSubCardRank = interactedSubCardRank, interactedSubCardCardinality = interactedSubCardCardinality, isRec = true isRec = true, ) } if (shouldActivityOpenInForeground(intent)) { Loading @@ -121,7 +119,7 @@ constructor( 0 /* delay */, expandable.activityTransitionController( InteractionJankMonitor.CUJ_SHADE_APP_LAUNCH_FROM_MEDIA_PLAYER ) ), ) } else { // Otherwise, open the activity in background directly. Loading @@ -133,7 +131,7 @@ constructor( repository.logSmartspaceCardUserEvent( eventId, MediaSmartspaceLogger.getSurface(location), isRec = true isRec = true, ) } Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaControlViewBinder.kt +2 −2 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.widget.ImageButton import androidx.constraintlayout.widget.ConstraintSet import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle import com.android.app.tracing.coroutines.launchTraced as launch import com.android.settingslib.widget.AdaptiveIcon import com.android.systemui.animation.Expandable import com.android.systemui.common.shared.model.Icon Loading Loading @@ -64,7 +65,6 @@ import com.android.systemui.surfaceeffects.ripple.RippleAnimationConfig import com.android.systemui.surfaceeffects.ripple.RippleShader import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.collectLatest import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext private const val TAG = "MediaControlViewBinder" Loading @@ -85,7 +85,7 @@ object MediaControlViewBinder { launch { viewModel.player.collectLatest { player -> player?.let { if (viewModel.isNewPlayer(it)) { if (viewModel.setPlayer(it)) { bindMediaCard( viewHolder, viewController, Loading