Fix media being stretched during the wake-up/unlock animation

This happened only on large screens/split shade, and when there was an
explicit delay to play the doze wake up animation.

During this delay, the device will not be in the "dozing" state anymore,
therefore media was showing up, but the rest of the keyguard was still
positioned as if it was in the "dozing" state, centered, and using the
full width of the screen. Since media is a child view of keyguard on
large screens, it was also using the full width of the screen.

The fix is to keep media hidden during this delay.

Fixes: 283479104
Test: KeyguardMediaControllerTest.kt
Test: NotificationPanelViewControllerTest.java
Change-Id: Id004a74d95e66e7f33ef52aca0dc655db767b893
(cherry picked from commit 574367ed81)
This commit is contained in:
Christian Göllner
2023-06-28 16:12:06 +01:00
committed by Chris Göllner
parent 3620213c62
commit f7cf732670
4 changed files with 50 additions and 1 deletions

View File

@@ -128,6 +128,15 @@ constructor(
var visibilityChangedListener: ((Boolean) -> Unit)? = null
/**
* Whether the doze wake up animation is delayed and we are currently waiting for it to start.
*/
var isDozeWakeUpAnimationWaiting: Boolean = false
set(value) {
field = value
refreshMediaPosition()
}
/** single pane media container placed at the top of the notifications list */
var singlePaneContainer: MediaContainerView? = null
private set
@@ -221,7 +230,13 @@ constructor(
// by the clock. This is not the case for single-line clock though.
// For single shade, we don't need to do it, because media is a child of NSSL, which already
// gets hidden on AOD.
return !statusBarStateController.isDozing
// Media also has to be hidden when waking up from dozing, and the doze wake up animation is
// delayed and waiting to be started.
// This is to stay in sync with the delaying of the horizontal alignment of the rest of the
// keyguard container, that is also delayed until the "wait" is over.
// If we show media during this waiting period, the shade will still be centered, and using
// the entire width of the screen, and making media show fully stretched.
return !statusBarStateController.isDozing && !isDozeWakeUpAnimationWaiting
}
private fun showMediaPlayer() {

View File

@@ -1621,6 +1621,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
mWillPlayDelayedDozeAmountAnimation = willPlay;
mWakeUpCoordinator.logDelayingClockWakeUpAnimation(willPlay);
mKeyguardMediaController.setDozeWakeUpAnimationWaiting(willPlay);
// Once changing this value, see if we should move the clock.
positionClockAndNotifications();

View File

@@ -192,6 +192,17 @@ class KeyguardMediaControllerTest : SysuiTestCase() {
assertThat(splitShadeContainer.visibility).isEqualTo(GONE)
}
@Test
fun dozeWakeUpAnimationWaiting_inSplitShade_mediaIsHidden() {
val splitShadeContainer = FrameLayout(context)
keyguardMediaController.attachSplitShadeContainer(splitShadeContainer)
keyguardMediaController.useSplitShade = true
keyguardMediaController.isDozeWakeUpAnimationWaiting = true
assertThat(splitShadeContainer.visibility).isEqualTo(GONE)
}
@Test
fun dozing_inSingleShade_mediaIsVisible() {
val splitShadeContainer = FrameLayout(context)
@@ -203,6 +214,17 @@ class KeyguardMediaControllerTest : SysuiTestCase() {
assertThat(mediaContainerView.visibility).isEqualTo(VISIBLE)
}
@Test
fun dozeWakeUpAnimationWaiting_inSingleShade_mediaIsVisible() {
val splitShadeContainer = FrameLayout(context)
keyguardMediaController.attachSplitShadeContainer(splitShadeContainer)
keyguardMediaController.useSplitShade = false
keyguardMediaController.isDozeWakeUpAnimationWaiting = true
assertThat(mediaContainerView.visibility).isEqualTo(VISIBLE)
}
private fun setDozing() {
whenever(statusBarStateController.isDozing).thenReturn(true)
statusBarStateListener.onDozingChanged(true)

View File

@@ -509,6 +509,17 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo
assertKeyguardStatusViewNotCentered();
}
@Test
public void keyguardStatusView_willPlayDelayedDoze_notifiesKeyguardMediaController() {
when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(2);
mStatusBarStateController.setState(KEYGUARD);
enableSplitShade(/* enabled= */ true);
mNotificationPanelViewController.setWillPlayDelayedDozeAmountAnimation(true);
verify(mKeyguardMediaController).setDozeWakeUpAnimationWaiting(true);
}
@Test
public void keyguardStatusView_willPlayDelayedDoze_isCentered_thenStillCenteredIfNoNotifs() {
when(mNotificationStackScrollLayoutController.getVisibleNotificationCount()).thenReturn(0);