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
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -212,7 +212,8 @@ public class MediaControlPanel {
|
||||
mMediaViewController.openGuts();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
closeGuts();
|
||||
return true;
|
||||
}
|
||||
});
|
||||
mPlayerViewHolder.getCancel().setOnClickListener(v -> {
|
||||
|
||||
@@ -273,6 +273,7 @@ class MediaHierarchyManager @Inject constructor(
|
||||
} else {
|
||||
updateDesiredLocation()
|
||||
qsExpanded = false
|
||||
closeGuts()
|
||||
}
|
||||
mediaCarouselController.mediaCarouselScrollHandler.visibleToUser = isVisibleToUser()
|
||||
}
|
||||
|
||||
@@ -289,6 +289,7 @@ public class MediaControlPanelTest : SysuiTestCase() {
|
||||
|
||||
captor.value.onLongClick(holder.player)
|
||||
verify(mediaViewController, never()).openGuts()
|
||||
verify(mediaViewController).closeGuts(false)
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user