Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +2 −0 Original line number Diff line number Diff line Loading @@ -166,6 +166,7 @@ constructor( } } /** Whether the media card currently has the "expanded" layout */ @VisibleForTesting var currentlyExpanded = true set(value) { Loading Loading @@ -501,6 +502,7 @@ constructor( mediaHostStatesManager.addCallback( object : MediaHostStatesManager.Callback { override fun onHostStateChanged(location: Int, mediaHostState: MediaHostState) { updateUserVisibility() if (location == desiredLocation) { onDesiredLocationChanged(desiredLocation, mediaHostState, animate = false) } Loading packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt +14 −15 Original line number Diff line number Diff line Loading @@ -257,7 +257,7 @@ constructor( if (value && (isLockScreenShadeVisibleToUser() || isHomeScreenShadeVisibleToUser())) { mediaCarouselController.logSmartspaceImpression(value) } mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() updateUserVisibility() } /** Loading Loading @@ -460,8 +460,7 @@ constructor( ) { mediaCarouselController.logSmartspaceImpression(qsExpanded) } mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() updateUserVisibility() } override fun onDozeAmountChanged(linear: Float, eased: Float) { Loading @@ -480,8 +479,7 @@ constructor( qsExpanded = false closeGuts() } mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() updateUserVisibility() } override fun onExpandedChanged(isExpanded: Boolean) { Loading @@ -489,8 +487,7 @@ constructor( if (isHomeScreenShadeVisibleToUser()) { mediaCarouselController.logSmartspaceImpression(qsExpanded) } mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() updateUserVisibility() } } ) Loading Loading @@ -532,9 +529,7 @@ constructor( } ) mediaCarouselController.updateUserVisibility = { mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() } mediaCarouselController.updateUserVisibility = this::updateUserVisibility mediaCarouselController.updateHostVisibility = { mediaHosts.forEach { it?.updateViewVisibility() } } Loading Loading @@ -1180,11 +1175,15 @@ constructor( return isCrossFadeAnimatorRunning } /** Returns true when the media card could be visible to the user if existed. */ private fun isVisibleToUser(): Boolean { return isLockScreenVisibleToUser() || /** Update whether or not the media carousel could be visible to the user */ private fun updateUserVisibility() { val shadeVisible = isLockScreenVisibleToUser() || isLockScreenShadeVisibleToUser() || isHomeScreenShadeVisibleToUser() val mediaVisible = qsExpanded || hasActiveMediaOrRecommendation mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = shadeVisible && mediaVisible } private fun isLockScreenVisibleToUser(): Boolean { Loading packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt +14 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { lateinit var configListener: ArgumentCaptor<ConfigurationController.ConfigurationListener> @Captor lateinit var visualStabilityCallback: ArgumentCaptor<OnReorderingAllowedListener> @Captor lateinit var keyguardCallback: ArgumentCaptor<KeyguardUpdateMonitorCallback> @Captor lateinit var hostStateCallback: ArgumentCaptor<MediaHostStatesManager.Callback> private val clock = FakeSystemClock() private lateinit var mediaCarouselController: MediaCarouselController Loading Loading @@ -143,6 +144,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { verify(visualStabilityProvider) .addPersistentReorderingAllowedListener(capture(visualStabilityCallback)) verify(keyguardUpdateMonitor).registerCallback(capture(keyguardCallback)) verify(mediaHostStatesManager).addCallback(capture(hostStateCallback)) whenever(mediaControlPanelFactory.get()).thenReturn(panel) whenever(panel.mediaViewController).thenReturn(mediaViewController) whenever(mediaDataManager.smartspaceMediaData).thenReturn(smartspaceMediaData) Loading Loading @@ -832,4 +834,16 @@ class MediaCarouselControllerTest : SysuiTestCase() { // Verify that seekbar listening attribute in media control panel is set to false. verify(panel, times(MediaPlayerData.players().size)).listening = false } @Test fun testOnHostStateChanged_updateVisibility() { var stateUpdated = false mediaCarouselController.updateUserVisibility = { stateUpdated = true } // When the host state updates hostStateCallback.value!!.onHostStateChanged(LOCATION_QS, mediaHostState) // Then the carousel visibility is updated assertTrue(stateUpdated) } } packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -470,6 +470,21 @@ class MediaHierarchyManagerTest : SysuiTestCase() { ) } @Test fun testQsExpandedChanged_noQqsMedia() { // When we are looking at QQS with active media whenever(statusBarStateController.state).thenReturn(StatusBarState.SHADE) whenever(statusBarStateController.isExpanded).thenReturn(true) // When there is no longer any active media whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(false) mediaHierarchyManager.qsExpanded = false // Then the carousel is set to not visible verify(mediaCarouselScrollHandler).visibleToUser = false assertThat(mediaCarouselScrollHandler.visibleToUser).isFalse() } private fun enableSplitShade() { context .getOrCreateTestableResources() Loading Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaCarouselController.kt +2 −0 Original line number Diff line number Diff line Loading @@ -166,6 +166,7 @@ constructor( } } /** Whether the media card currently has the "expanded" layout */ @VisibleForTesting var currentlyExpanded = true set(value) { Loading Loading @@ -501,6 +502,7 @@ constructor( mediaHostStatesManager.addCallback( object : MediaHostStatesManager.Callback { override fun onHostStateChanged(location: Int, mediaHostState: MediaHostState) { updateUserVisibility() if (location == desiredLocation) { onDesiredLocationChanged(desiredLocation, mediaHostState, animate = false) } Loading
packages/SystemUI/src/com/android/systemui/media/controls/ui/MediaHierarchyManager.kt +14 −15 Original line number Diff line number Diff line Loading @@ -257,7 +257,7 @@ constructor( if (value && (isLockScreenShadeVisibleToUser() || isHomeScreenShadeVisibleToUser())) { mediaCarouselController.logSmartspaceImpression(value) } mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() updateUserVisibility() } /** Loading Loading @@ -460,8 +460,7 @@ constructor( ) { mediaCarouselController.logSmartspaceImpression(qsExpanded) } mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() updateUserVisibility() } override fun onDozeAmountChanged(linear: Float, eased: Float) { Loading @@ -480,8 +479,7 @@ constructor( qsExpanded = false closeGuts() } mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() updateUserVisibility() } override fun onExpandedChanged(isExpanded: Boolean) { Loading @@ -489,8 +487,7 @@ constructor( if (isHomeScreenShadeVisibleToUser()) { mediaCarouselController.logSmartspaceImpression(qsExpanded) } mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() updateUserVisibility() } } ) Loading Loading @@ -532,9 +529,7 @@ constructor( } ) mediaCarouselController.updateUserVisibility = { mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() } mediaCarouselController.updateUserVisibility = this::updateUserVisibility mediaCarouselController.updateHostVisibility = { mediaHosts.forEach { it?.updateViewVisibility() } } Loading Loading @@ -1180,11 +1175,15 @@ constructor( return isCrossFadeAnimatorRunning } /** Returns true when the media card could be visible to the user if existed. */ private fun isVisibleToUser(): Boolean { return isLockScreenVisibleToUser() || /** Update whether or not the media carousel could be visible to the user */ private fun updateUserVisibility() { val shadeVisible = isLockScreenVisibleToUser() || isLockScreenShadeVisibleToUser() || isHomeScreenShadeVisibleToUser() val mediaVisible = qsExpanded || hasActiveMediaOrRecommendation mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = shadeVisible && mediaVisible } private fun isLockScreenVisibleToUser(): Boolean { Loading
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaCarouselControllerTest.kt +14 −0 Original line number Diff line number Diff line Loading @@ -110,6 +110,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { lateinit var configListener: ArgumentCaptor<ConfigurationController.ConfigurationListener> @Captor lateinit var visualStabilityCallback: ArgumentCaptor<OnReorderingAllowedListener> @Captor lateinit var keyguardCallback: ArgumentCaptor<KeyguardUpdateMonitorCallback> @Captor lateinit var hostStateCallback: ArgumentCaptor<MediaHostStatesManager.Callback> private val clock = FakeSystemClock() private lateinit var mediaCarouselController: MediaCarouselController Loading Loading @@ -143,6 +144,7 @@ class MediaCarouselControllerTest : SysuiTestCase() { verify(visualStabilityProvider) .addPersistentReorderingAllowedListener(capture(visualStabilityCallback)) verify(keyguardUpdateMonitor).registerCallback(capture(keyguardCallback)) verify(mediaHostStatesManager).addCallback(capture(hostStateCallback)) whenever(mediaControlPanelFactory.get()).thenReturn(panel) whenever(panel.mediaViewController).thenReturn(mediaViewController) whenever(mediaDataManager.smartspaceMediaData).thenReturn(smartspaceMediaData) Loading Loading @@ -832,4 +834,16 @@ class MediaCarouselControllerTest : SysuiTestCase() { // Verify that seekbar listening attribute in media control panel is set to false. verify(panel, times(MediaPlayerData.players().size)).listening = false } @Test fun testOnHostStateChanged_updateVisibility() { var stateUpdated = false mediaCarouselController.updateUserVisibility = { stateUpdated = true } // When the host state updates hostStateCallback.value!!.onHostStateChanged(LOCATION_QS, mediaHostState) // Then the carousel visibility is updated assertTrue(stateUpdated) } }
packages/SystemUI/tests/src/com/android/systemui/media/controls/ui/MediaHierarchyManagerTest.kt +15 −0 Original line number Diff line number Diff line Loading @@ -470,6 +470,21 @@ class MediaHierarchyManagerTest : SysuiTestCase() { ) } @Test fun testQsExpandedChanged_noQqsMedia() { // When we are looking at QQS with active media whenever(statusBarStateController.state).thenReturn(StatusBarState.SHADE) whenever(statusBarStateController.isExpanded).thenReturn(true) // When there is no longer any active media whenever(mediaDataManager.hasActiveMediaOrRecommendation()).thenReturn(false) mediaHierarchyManager.qsExpanded = false // Then the carousel is set to not visible verify(mediaCarouselScrollHandler).visibleToUser = false assertThat(mediaCarouselScrollHandler.visibleToUser).isFalse() } private fun enableSplitShade() { context .getOrCreateTestableResources() Loading