From 3fa5f047426912e1d1927b3e6ece6d1984735390 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Mon, 10 May 2021 18:24:12 -0400 Subject: [PATCH] Close guts during transitions - Animate close when swiping between players in carousel - Close when long pressing on the guts - Close when screen turns off - If media only shows in QS, close after going to QQS or lockscreen Fixes: 184535725 Fixes: 182292357 Test: visual Test: atest com.android.systemui.media Change-Id: I596d8dc30d714098cb84f0f0779c2e233fffcf0e --- .../systemui/media/MediaCarouselController.kt | 12 ++++++++++-- .../systemui/media/MediaCarouselScrollHandler.kt | 4 ++-- .../android/systemui/media/MediaControlPanel.java | 3 ++- .../systemui/media/MediaHierarchyManager.kt | 1 + .../systemui/media/MediaControlPanelTest.kt | 1 + .../systemui/media/MediaHierarchyManagerTest.kt | 15 +++++++++++++++ 6 files changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt index 644876c6b1afe..f55f57b359a22 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselController.kt @@ -520,12 +520,20 @@ class MediaCarouselController @Inject constructor( this.desiredLocation = desiredLocation this.desiredHostState = it currentlyExpanded = it.expansion > 0 + + val shouldCloseGuts = !currentlyExpanded && !mediaManager.hasActiveMedia() && + desiredHostState.showsOnlyActiveMedia + for (mediaPlayer in MediaPlayerData.players()) { if (animate) { mediaPlayer.mediaViewController.animatePendingStateChange( duration = duration, delay = startDelay) } + if (shouldCloseGuts && mediaPlayer.mediaViewController.isGutsVisible) { + mediaPlayer.closeGuts(!animate) + } + mediaPlayer.mediaViewController.onLocationPreChange(desiredLocation) } mediaCarouselScrollHandler.showsSettingsButton = !it.showsOnlyActiveMedia @@ -541,9 +549,9 @@ class MediaCarouselController @Inject constructor( } } - fun closeGuts() { + fun closeGuts(immediate: Boolean = true) { MediaPlayerData.players().forEach { - it.closeGuts(true) + it.closeGuts(immediate) } } diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt index e5a62711a8d04..c806bcfed345a 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaCarouselScrollHandler.kt @@ -59,7 +59,7 @@ class MediaCarouselScrollHandler( private val mainExecutor: DelayableExecutor, private val dismissCallback: () -> Unit, private var translationChangedListener: () -> Unit, - private val closeGuts: () -> Unit, + private val closeGuts: (immediate: Boolean) -> Unit, private val falsingCollector: FalsingCollector, private val falsingManager: FalsingManager, private val logSmartspaceImpression: () -> Unit @@ -473,7 +473,7 @@ class MediaCarouselScrollHandler( if (oldIndex != visibleMediaIndex && visibleToUser) { logSmartspaceImpression() } - closeGuts() + closeGuts(false) updatePlayerVisibilities() } val relativeLocation = visibleMediaIndex.toFloat() + if (playerWidthPlusPadding > 0) diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java index fe3463f853f02..80f74c40f7b43 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java +++ b/packages/SystemUI/src/com/android/systemui/media/MediaControlPanel.java @@ -212,7 +212,8 @@ public class MediaControlPanel { mMediaViewController.openGuts(); return true; } else { - return false; + closeGuts(); + return true; } }); mPlayerViewHolder.getCancel().setOnClickListener(v -> { diff --git a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt index 3c28f6e1651a1..60e832ace7b01 100644 --- a/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/MediaHierarchyManager.kt @@ -273,6 +273,7 @@ class MediaHierarchyManager @Inject constructor( } else { updateDesiredLocation() qsExpanded = false + closeGuts() } mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt index dd3a19228b4ea..e62fa912e610c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaControlPanelTest.kt @@ -289,6 +289,7 @@ public class MediaControlPanelTest : SysuiTestCase() { captor.value.onLongClick(holder.player) verify(mediaViewController, never()).openGuts() + verify(mediaViewController).closeGuts(false) } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt index 406f40c75735c..a974421a9b7cd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/MediaHierarchyManagerTest.kt @@ -24,6 +24,7 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.controls.controller.ControlsControllerImplTest.Companion.eq import com.android.systemui.keyguard.WakefulnessLifecycle +import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.NotificationLockscreenUserManager import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.SysuiStatusBarStateController @@ -73,11 +74,15 @@ class MediaHierarchyManagerTest : SysuiTestCase() { @Mock private lateinit var mediaCarouselController: MediaCarouselController @Mock + private lateinit var mediaCarouselScrollHandler: MediaCarouselScrollHandler + @Mock private lateinit var wakefulnessLifecycle: WakefulnessLifecycle @Mock private lateinit var statusBarKeyguardViewManager: StatusBarKeyguardViewManager @Captor private lateinit var wakefullnessObserver: ArgumentCaptor<(WakefulnessLifecycle.Observer)> + @Captor + private lateinit var statusBarCallback: ArgumentCaptor<(StatusBarStateController.StateListener)> @JvmField @Rule val mockito = MockitoJUnit.rule() @@ -96,10 +101,13 @@ class MediaHierarchyManagerTest : SysuiTestCase() { wakefulnessLifecycle, statusBarKeyguardViewManager) verify(wakefulnessLifecycle).addObserver(wakefullnessObserver.capture()) + verify(statusBarStateController).addCallback(statusBarCallback.capture()) setupHost(lockHost, MediaHierarchyManager.LOCATION_LOCKSCREEN) setupHost(qsHost, MediaHierarchyManager.LOCATION_QS) setupHost(qqsHost, MediaHierarchyManager.LOCATION_QQS) `when`(statusBarStateController.state).thenReturn(StatusBarState.SHADE) + `when`(mediaCarouselController.mediaCarouselScrollHandler) + .thenReturn(mediaCarouselScrollHandler) // We'll use the viewmanager to verify a few calls below, let's reset this. clearInvocations(mediaCarouselController) } @@ -153,4 +161,11 @@ class MediaHierarchyManagerTest : SysuiTestCase() { verify(mediaCarouselController).closeGuts() } + + @Test + fun testCloseGutsWhenDoze() { + statusBarCallback.value.onDozingChanged(true) + + verify(mediaCarouselController).closeGuts() + } } \ No newline at end of file